/*
* Copyright (C) 2005-2012 BetaCONCEPT Limited
*
* This file is part of Astroboa.
*
* Astroboa is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* Astroboa is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with Astroboa. If not, see <http://www.gnu.org/licenses/>.
*/
package org.betaconceptframework.astroboa.test.engine.service;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Calendar;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.regex.Pattern;
import javax.activation.MimetypesFileTypeMap;
import javax.jcr.ItemNotFoundException;
import javax.jcr.Node;
import javax.jcr.Property;
import javax.jcr.RepositoryException;
import javax.jcr.Value;
import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.io.FileUtils;
import org.apache.commons.lang.StringUtils;
import org.apache.commons.lang.time.DateFormatUtils;
import org.apache.log4j.Level;
import org.betaconceptframework.astroboa.api.model.BinaryChannel;
import org.betaconceptframework.astroboa.api.model.BinaryProperty;
import org.betaconceptframework.astroboa.api.model.BooleanProperty;
import org.betaconceptframework.astroboa.api.model.CalendarProperty;
import org.betaconceptframework.astroboa.api.model.CmsProperty;
import org.betaconceptframework.astroboa.api.model.ComplexCmsProperty;
import org.betaconceptframework.astroboa.api.model.ContentObject;
import org.betaconceptframework.astroboa.api.model.DoubleProperty;
import org.betaconceptframework.astroboa.api.model.LongProperty;
import org.betaconceptframework.astroboa.api.model.ObjectReferenceProperty;
import org.betaconceptframework.astroboa.api.model.RepositoryUser;
import org.betaconceptframework.astroboa.api.model.Space;
import org.betaconceptframework.astroboa.api.model.StringProperty;
import org.betaconceptframework.astroboa.api.model.Taxonomy;
import org.betaconceptframework.astroboa.api.model.Topic;
import org.betaconceptframework.astroboa.api.model.TopicReferenceProperty;
import org.betaconceptframework.astroboa.api.model.ValueType;
import org.betaconceptframework.astroboa.api.model.definition.CmsPropertyDefinition;
import org.betaconceptframework.astroboa.api.model.exception.CmsConcurrentModificationException;
import org.betaconceptframework.astroboa.api.model.exception.CmsException;
import org.betaconceptframework.astroboa.api.model.io.FetchLevel;
import org.betaconceptframework.astroboa.api.model.io.ImportConfiguration;
import org.betaconceptframework.astroboa.api.model.io.ImportConfiguration.PersistMode;
import org.betaconceptframework.astroboa.api.model.io.ResourceRepresentationType;
import org.betaconceptframework.astroboa.api.model.query.CacheRegion;
import org.betaconceptframework.astroboa.api.model.query.CmsOutcome;
import org.betaconceptframework.astroboa.api.model.query.Condition;
import org.betaconceptframework.astroboa.api.model.query.Order;
import org.betaconceptframework.astroboa.api.model.query.QueryOperator;
import org.betaconceptframework.astroboa.api.model.query.criteria.ContentObjectCriteria;
import org.betaconceptframework.astroboa.api.model.query.criteria.ContentObjectReferenceCriterion;
import org.betaconceptframework.astroboa.api.security.CmsRole;
import org.betaconceptframework.astroboa.api.security.exception.CmsUnauthorizedAccessException;
import org.betaconceptframework.astroboa.context.AstroboaClientContextHolder;
import org.betaconceptframework.astroboa.engine.jcr.query.CalendarInfo;
import org.betaconceptframework.astroboa.engine.jcr.util.CmsRepositoryEntityUtils;
import org.betaconceptframework.astroboa.engine.jcr.util.PopulateContentObject;
import org.betaconceptframework.astroboa.engine.jcr.util.PopulateSimpleCmsProperty;
import org.betaconceptframework.astroboa.engine.service.security.aspect.SecureContentObjectSaveAspect;
import org.betaconceptframework.astroboa.model.factory.CmsCriteriaFactory;
import org.betaconceptframework.astroboa.model.factory.CmsRepositoryEntityFactoryForActiveClient;
import org.betaconceptframework.astroboa.model.factory.CriterionFactory;
import org.betaconceptframework.astroboa.model.impl.LazyCmsProperty;
import org.betaconceptframework.astroboa.model.impl.item.CmsBuiltInItem;
import org.betaconceptframework.astroboa.model.impl.item.JcrBuiltInItem;
import org.betaconceptframework.astroboa.model.impl.query.criteria.ContentObjectReferenceCritetionImpl;
import org.betaconceptframework.astroboa.model.impl.query.xpath.XPathUtils;
import org.betaconceptframework.astroboa.security.CmsRoleAffiliationFactory;
import org.betaconceptframework.astroboa.test.AstroboaTestContext;
import org.betaconceptframework.astroboa.test.TestConstants;
import org.betaconceptframework.astroboa.test.engine.AbstractRepositoryTest;
import org.betaconceptframework.astroboa.test.engine.CmsPropertyPath;
import org.betaconceptframework.astroboa.test.log.TestLogPolicy;
import org.betaconceptframework.astroboa.test.util.JAXBTestUtils;
import org.betaconceptframework.astroboa.test.util.JcrUtils;
import org.betaconceptframework.astroboa.test.util.TestUtils;
import org.betaconceptframework.astroboa.util.CmsConstants;
import org.betaconceptframework.astroboa.util.CmsConstants.ContentObjectStatus;
import org.betaconceptframework.astroboa.util.PropertyPath;
import org.testng.Assert;
import org.testng.annotations.Test;
/**
* @author Gregory Chomatas (gchomatas@betaconcept.com)
* @author Savvas Triantafyllou (striantafyllou@betaconcept.com)
*
*/
public class ContentServiceTest extends AbstractRepositoryTest {
@Test
public void testRemovePropertiesWhichRepresentXmlAttributesViaXMLorJSONSave() throws Throwable {
RepositoryUser systemUser = getSystemUser();
ContentObject contentObject = createContentObjectForType(INDENPENDENT_CONTENT_TYPE_NAME, systemUser, "test-remove-property-which-represent-xml-attribute-via-xml-json");
String attributeValue = "attribute-value";
((StringProperty)contentObject.getCmsProperty("mandatorySimpleStringFromAttribute")).addSimpleTypeValue(attributeValue);
contentObject = contentService.save(contentObject, false, true, null);
markObjectForRemoval(contentObject);
List<ResourceRepresentationType<String>> types = Arrays.asList(ResourceRepresentationType.XML,ResourceRepresentationType.JSON);
//cmsPropertyPath = CmsPropertyPath.statisticTypeMultiple;
StringBuilder message = new StringBuilder();
for (ResourceRepresentationType<String> resourceRepresentationType : types){
try{
contentObject = contentService.getContentObject(contentObject.getId(), ResourceRepresentationType.CONTENT_OBJECT_INSTANCE, FetchLevel.ENTITY, CacheRegion.NONE, null, false);
String propertyPath = "simpleStringFromAttribute";
//Create value
addValueForProperty(contentObject, propertyPath);
//Save object
if (resourceRepresentationType.equals(ResourceRepresentationType.JSON)){
message.append("\nAbout to save value for property "+propertyPath+"\n"+contentObject.json(true, false, propertyPath));
}
else if (resourceRepresentationType.equals(ResourceRepresentationType.XML)){
message.append("\nAbout to save value for property "+propertyPath+"\n"+contentObject.xml(true, false, propertyPath));
}
//Save object
contentObject = contentService.save(contentObject, false, true, null);
//Nullify value
String contentWithNullifiedProperty = nullifyValueForProperty(propertyPath, contentObject, resourceRepresentationType);
message.append("\nAbout to save with the nullified property "+ contentWithNullifiedProperty);
contentObject = contentService.save(contentWithNullifiedProperty, false, true, null);
//Assert that property does not exist anymore
contentObject = contentService.getContentObject(contentObject.getId(), ResourceRepresentationType.CONTENT_OBJECT_INSTANCE, FetchLevel.ENTITY, CacheRegion.NONE, null, false);
Assert.assertFalse(contentObject.hasValueForProperty(propertyPath), "Property "+propertyPath+ "was not removed although a null value is provided upon save. Imported content \n"+ contentWithNullifiedProperty+ " \n Content existing in repository \n"+contentObject.json(true, false, propertyPath));
if (resourceRepresentationType.equals(ResourceRepresentationType.JSON)){
message.append("\nAFTER REMOVAL\n" + contentObject.json(true, false, propertyPath));
}
else if (resourceRepresentationType.equals(ResourceRepresentationType.XML)){
message.append("\nAFTER REMOVAL\n" + contentObject.xml(true, false, propertyPath));
}
}
catch(Throwable t){
logger.error(message.toString());
throw t;
}
}
}
@Test
public void testSaveObjectWhosePropertyRepresentsAnXmlAttribute(){
ContentObject independentObject = createContentObjectForType(INDENPENDENT_CONTENT_TYPE_NAME, getSystemUser(), "test-save-with-property-as-an-attribute");
String attributeValue = "attribute-value";
((StringProperty)independentObject.getCmsProperty("mandatorySimpleStringFromAttribute")).addSimpleTypeValue(attributeValue);
String xml = independentObject.xml(false);
independentObject = contentService.save(xml, false, true, null);
markObjectForRemoval(independentObject);
//Reload object
independentObject = contentService.getContentObject(independentObject.getId(), ResourceRepresentationType.CONTENT_OBJECT_INSTANCE, FetchLevel.FULL, CacheRegion.NONE, null, false);
assertPropertyExistsAndHasTheExpectedValue(independentObject, "mandatorySimpleStringFromAttribute", attributeValue);
//Change value and save again
attributeValue = "attribute-value-new";
((StringProperty)independentObject.getCmsProperty("mandatorySimpleStringFromAttribute")).addSimpleTypeValue(attributeValue);
xml = independentObject.xml(false);
independentObject = contentService.save(xml, false, true, null);
//Reload object
independentObject = contentService.getContentObject(independentObject.getId(), ResourceRepresentationType.CONTENT_OBJECT_INSTANCE, FetchLevel.FULL, CacheRegion.NONE, null, false);
assertPropertyExistsAndHasTheExpectedValue(independentObject, "mandatorySimpleStringFromAttribute", attributeValue);
//Now try JSON
attributeValue = "attribute-value-new-for-json";
((StringProperty)independentObject.getCmsProperty("mandatorySimpleStringFromAttribute")).addSimpleTypeValue(attributeValue);
String json = independentObject.json(false);
independentObject = contentService.save(json, false, true, null);
//Reload object
independentObject = contentService.getContentObject(independentObject.getId(), ResourceRepresentationType.CONTENT_OBJECT_INSTANCE, FetchLevel.FULL, CacheRegion.NONE, null, false);
assertPropertyExistsAndHasTheExpectedValue(independentObject, "mandatorySimpleStringFromAttribute", attributeValue);
}
@Test
public void testRemovePropertyThatHasNotBeenLoaded(){
RepositoryUser systemUser = getSystemUser();
ContentObject contentObject = createContentObject(systemUser, "test-remove-property-that-has-not-been-loaded");
((StringProperty)contentObject.getCmsProperty("simpleString")).addSimpleTypeValue("Simple value");
contentObject = contentService.save(contentObject, false, true, null);
markObjectForRemoval(contentObject);
contentObject = contentService.getContentObject(contentObject.getId(), ResourceRepresentationType.CONTENT_OBJECT_INSTANCE, FetchLevel.ENTITY, null, null, false);
contentObject.removeCmsProperty("simpleString");
contentObject = contentService.save(contentObject, false, true, null);
ContentObject object = contentService.getContentObject(contentObject.getId(), ResourceRepresentationType.CONTENT_OBJECT_INSTANCE, FetchLevel.ENTITY, null, null, false);
CmsProperty simpleStringProperty = object.getCmsProperty("simpleString");
Assert.assertTrue(((StringProperty)simpleStringProperty).hasNoValues(), "Property simpleString has values in object "+ object.getSystemName());
}
@Test
public void testSaveObjectReferenceUsingSystemName(){
RepositoryUser systemUser = getSystemUser();
ContentObject contentObject = createContentObject(systemUser, "test-save-reference-using-system-name");
contentObject = contentService.save(contentObject, false, true, null);
markObjectForRemoval(contentObject);
ContentObject reference = createContentObject(systemUser, "test-save-reference-using-system-name-reference-object");
reference = contentService.save(reference, false, true, null);
markObjectForRemoval(reference);
//reload object
contentObject = contentService.getContentObject(contentObject.getId(), ResourceRepresentationType.CONTENT_OBJECT_INSTANCE, FetchLevel.ENTITY, null, null, false);
//Reload referenced object and remove its id
String referenceId = new String(reference.getId());
reference = contentService.getContentObject(reference.getId(), ResourceRepresentationType.CONTENT_OBJECT_INSTANCE, FetchLevel.ENTITY, null, null, false);
reference.setId(null);
((ObjectReferenceProperty)contentObject.getCmsProperty("simpleContentObject")).addSimpleTypeValue(reference);
//Save object
contentService.save(contentObject, false, true, null);
//Assert that object reference exists
assertObjectHasReference(contentObject.getId(), referenceId, "simpleContentObject");
//remove property and try to save it using xml
contentObject.removeCmsProperty("simpleContentObject");
contentService.save(contentObject, false, true, null);
contentObject = contentService.getContentObject(contentObject.getId(), ResourceRepresentationType.CONTENT_OBJECT_INSTANCE, FetchLevel.ENTITY, null, null, false);
reference.setId(null);
((ObjectReferenceProperty)contentObject.getCmsProperty("simpleContentObject")).addSimpleTypeValue(reference);
contentService.save(contentObject.xml(false, false, "simpleContentObject"), false, true, null);
//Assert that object reference exists
assertObjectHasReference(contentObject.getId(), referenceId, "simpleContentObject");
//remove property and try to save it using json
contentObject.removeCmsProperty("simpleContentObject");
contentService.save(contentObject, false, true, null);
contentObject = contentService.getContentObject(contentObject.getId(), ResourceRepresentationType.CONTENT_OBJECT_INSTANCE, FetchLevel.ENTITY, null, null, false);
reference.setId(null);
((ObjectReferenceProperty)contentObject.getCmsProperty("simpleContentObject")).addSimpleTypeValue(reference);
contentService.save(contentObject.json(false, false, "simpleContentObject"), false, true, null);
//Assert that object reference exists
assertObjectHasReference(contentObject.getId(), referenceId, "simpleContentObject");
}
@Test
public void testRemovePropertiesViaXMLorJSONSave() throws Throwable {
createContentToBeUsedForReferences();
RepositoryUser systemUser = getSystemUser();
ContentObject contentObject = createContentObjectForType(TEST_CONTENT_TYPE, systemUser, "test-remove-property-via-xml-json-with-binary-content");
contentObject = contentService.save(contentObject, false, true, null);
markObjectForRemoval(contentObject);
List<ResourceRepresentationType<String>> types = Arrays.asList(ResourceRepresentationType.XML,ResourceRepresentationType.JSON);
for (CmsPropertyPath cmsPropertyPath : CmsPropertyPath.values()){
//cmsPropertyPath = CmsPropertyPath.statisticTypeMultiple;
StringBuilder message = new StringBuilder();
for (ResourceRepresentationType<String> resourceRepresentationType : types){
try{
contentObject = contentService.getContentObject(contentObject.getId(), ResourceRepresentationType.CONTENT_OBJECT_INSTANCE, FetchLevel.ENTITY, CacheRegion.NONE, null, false);
String propertyPath = cmsPropertyPath.getPeriodDelimitedPath();
boolean valueForBodyHAsBeenAdded = false;
//Create value
addValueForProperty(contentObject, propertyPath);
//Special case
if (propertyPath.endsWith("bodyMultiple")){
//we must provide a body as well
addValueForProperty(contentObject, propertyPath.replace("bodyMultiple", "body"));
valueForBodyHAsBeenAdded = true;
}
else if (propertyPath.startsWith("statisticType")){
addValueForProperty(contentObject, propertyPath+ ".viewCounter");
}
//Save object
if (resourceRepresentationType.equals(ResourceRepresentationType.JSON)){
message.append("\nAbout to save value for property "+propertyPath+"\n"+contentObject.json(true, false, propertyPath));
}
else if (resourceRepresentationType.equals(ResourceRepresentationType.XML)){
message.append("\nAbout to save value for property "+propertyPath+"\n"+contentObject.xml(true, false, propertyPath));
}
//Save object
contentObject = contentService.save(contentObject, false, true, null);
//Nullify value
String contentWithNullifiedProperty = nullifyValueForProperty(propertyPath, contentObject, resourceRepresentationType);
if (valueForBodyHAsBeenAdded){
contentWithNullifiedProperty = nullifyValueForProperty(propertyPath.replace("bodyMultiple", "body"), contentObject, resourceRepresentationType);
}
message.append("\nAbout to save with the nullified property "+ contentWithNullifiedProperty);
contentObject = contentService.save(contentWithNullifiedProperty, false, true, null);
//Assert that property does not exist anymore
contentObject = contentService.getContentObject(contentObject.getId(), ResourceRepresentationType.CONTENT_OBJECT_INSTANCE, FetchLevel.ENTITY, CacheRegion.NONE, null, false);
Assert.assertFalse(contentObject.hasValueForProperty(propertyPath), "Property "+propertyPath+ "was not removed although a null value is provided upon save. Imported content \n"+ contentWithNullifiedProperty+ " \n Content existing in repository \n"+contentObject.json(true, false, propertyPath));
if (resourceRepresentationType.equals(ResourceRepresentationType.JSON)){
message.append("\nAFTER REMOVAL\n" + contentObject.json(true, false, propertyPath));
}
else if (resourceRepresentationType.equals(ResourceRepresentationType.XML)){
message.append("\nAFTER REMOVAL\n" + contentObject.xml(true, false, propertyPath));
}
}
catch(Throwable t){
logger.error(message.toString());
throw t;
}
}
}
}
private String nullifyValueForProperty(String propertyPath, ContentObject contentObject, ResourceRepresentationType<String> resourceRepresentationType) {
String correctPropertyPathForRemoval = getPathForRemoval(contentObject, propertyPath);
contentObject.removeCmsProperty(correctPropertyPathForRemoval);
if (resourceRepresentationType.equals(ResourceRepresentationType.JSON)){
return contentObject.json(true, false, propertyPath);
}
else if (resourceRepresentationType.equals(ResourceRepresentationType.XML)){
return contentObject.xml(true, false, propertyPath);
}
return null;
}
private String getPathForRemoval(ContentObject contentObject,
String propertyPath) {
if (! propertyPath.contains(".")){
return propertyPath;
}
String removalPath = "";
String[] parts = propertyPath.split("\\.");
if (parts == null || parts.length == 0){
return propertyPath;
}
for (String part : parts){
if (StringUtils.isNotBlank(removalPath)){
removalPath = removalPath + "."+ part;
}
else{
removalPath = part;
}
CmsProperty<?, ?> property = contentObject.getCmsProperty(removalPath);
if ( ((CmsPropertyDefinition)property.getPropertyDefinition()).isMultiple() &&
((CmsPropertyDefinition)property.getPropertyDefinition()).getValueType() == ValueType.Complex ){
removalPath = removalPath +"[0]";
}
}
if (removalPath.endsWith("[0]")){
return removalPath.substring(0, removalPath.length()-3);
}
else if (removalPath.endsWith(".")){
return removalPath.substring(0, removalPath.length()-1);
}
else{
return removalPath;
}
}
private void createContentToBeUsedForReferences(){
//Create content for test
RepositoryUser systemUser = getSystemUser();
Taxonomy subjectTaxonomy = getSubjectTaxonomy();
//Create Topics
Topic topic = JAXBTestUtils.createTopic("firstSubjectForRemovalOfProperties",
cmsRepositoryEntityFactory.newTopic(),
cmsRepositoryEntityFactory.newRepositoryUser());
topic.setOwner(systemUser);
topic.setTaxonomy(subjectTaxonomy);
Topic childTopic1 = JAXBTestUtils.createTopic("secondSubjectForRemovalOfProperties",
cmsRepositoryEntityFactory.newTopic(),
cmsRepositoryEntityFactory.newRepositoryUser());
childTopic1.setOwner(topic.getOwner());
childTopic1.setTaxonomy(subjectTaxonomy);
topic.addChild(childTopic1);
topic = topicService.save(topic);
markTopicForRemoval(topic);
//Create one contentObject to be used as a value to a content object property
ContentObject contentObjectForContentObjectPropertyValue = createContentObject(systemUser, "valueForContentObjectPropertyForRemovalOfProperties");
contentObjectForContentObjectPropertyValue = contentService.save(contentObjectForContentObjectPropertyValue, false, true, null);
markObjectForRemoval(contentObjectForContentObjectPropertyValue);
ContentObject contentObjectForContentObjectPropertyValue2 = createContentObject(systemUser, "valueForContentObjectPropertyForRemovalOfProperties2");
contentObjectForContentObjectPropertyValue2 = contentService.save(contentObjectForContentObjectPropertyValue2, false, true, null);
markObjectForRemoval(contentObjectForContentObjectPropertyValue2);
}
/*
* Test for saving XML or JSON with binary content of a property whose name
* is 'content' like arrayOfFileResourceTypeObject.fileResource.content
*/
@Test
public void testSaveXMLorJSONWithBinaryContentSpecialCase() throws Exception{
//Create object
RepositoryUser systemUser = getSystemUser();
//Save XML which contains binary content
ContentObject contentObject = createArrayOfFileResources(0, systemUser);
String xml = contentObject.xml(false, true);
contentObject = saveAndAssertBinaryContentIsSaved(contentObject, xml, logo, "fileResource.content", null);
markObjectForRemoval(contentObject);
//Check that update is also working
xml = contentObject.xml(false, true);
saveAndAssertBinaryContentIsSaved(contentObject, xml, logo, "fileResource.content", null);
//Save JSON which contains binary content
contentObject = createArrayOfFileResources(1, systemUser);
String json = contentObject.json(false, true);
contentObject = saveAndAssertBinaryContentIsSaved(contentObject, json, logo, "fileResource.content", null);
markObjectForRemoval(contentObject);
//Check that update is also working
json = contentObject.json(false, true);
saveAndAssertBinaryContentIsSaved(contentObject, json, logo, "fileResource.content", null);
//Use XML/JSON exported from API
xml = contentService.getContentObject(contentObject.getId(), ResourceRepresentationType.XML, FetchLevel.FULL, CacheRegion.NONE, null, true);
contentObject = saveAndAssertBinaryContentIsSaved(contentObject, xml, logo, "fileResource.content", null);
json = contentService.getContentObject(contentObject.getId(), ResourceRepresentationType.JSON, FetchLevel.FULL, CacheRegion.NONE, null, true);
contentObject = saveAndAssertBinaryContentIsSaved(contentObject, json, logo, "fileResource.content", null);
}
private ContentObject createArrayOfFileResources(int index, RepositoryUser systemUser) throws IOException{
ContentObject contentObject = createContentObjectForType("arrayOfFileResourceTypeObject", systemUser, "test-save-xml-json-with-binary-content-arrayOfFileResourceTypeObject-"+index);
BinaryChannel logoBinaryChannel = loadManagedBinaryChannel(logo, "content");
((StringProperty)contentObject.getCmsProperty("fileResource.title")).setSimpleTypeValue("Test Title");
BinaryProperty imageProperty = (BinaryProperty)contentObject.getCmsProperty("fileResource.content");
imageProperty.addSimpleTypeValue(logoBinaryChannel);
((StringProperty)contentObject.getCmsProperty("fileResource[1].title")).setSimpleTypeValue("Test Title2");
BinaryProperty imageProperty2 = (BinaryProperty)contentObject.getCmsProperty("fileResource[1].content");
imageProperty2.addSimpleTypeValue(logoBinaryChannel);
return contentObject;
}
@Test
public void testSaveXMLorJSONWithBinaryContent() throws Exception{
//Create object
RepositoryUser systemUser = getSystemUser();
//Add binary channel to object
ContentObject contentObject = createContentObjectForType(TEST_CONTENT_TYPE, systemUser, "test-save-xml-json-with-binary-content");
BinaryChannel logoBinaryChannel = loadManagedBinaryChannel(logo, "image");
BinaryProperty imageProperty = (BinaryProperty)contentObject.getCmsProperty("image");
imageProperty.addSimpleTypeValue(logoBinaryChannel);
contentObject = contentService.save(contentObject, false, true, null);
markObjectForRemoval(contentObject);
//Save XML which contains binary content
String xml = contentObject.xml(false, true);
contentObject = saveAndAssertBinaryContentIsSaved(contentObject, xml, logo, "image", null);
//Save JSON which contains binary content
String json = contentObject.json(false, true);
contentObject = saveAndAssertBinaryContentIsSaved(contentObject, json, logo, "image", null);
//Use XML/JSON exported from API
xml = contentService.getContentObject(contentObject.getId(), ResourceRepresentationType.XML, FetchLevel.FULL, CacheRegion.NONE, null, true);
contentObject = saveAndAssertBinaryContentIsSaved(contentObject, xml, logo, "image", null);
json = contentService.getContentObject(contentObject.getId(), ResourceRepresentationType.JSON, FetchLevel.FULL, CacheRegion.NONE, null, true);
contentObject = saveAndAssertBinaryContentIsSaved(contentObject, json, logo, "image", null);
//Get binary channel content
Map<String, byte[]> binaryContent = new HashMap<String, byte[]>();
String imageURL = logoBinaryChannel.buildResourceApiURL(null, null, null, null, null, false, false);
byte[] contentCopy = Arrays.copyOf(logoBinaryChannel.getContent(), logoBinaryChannel.getContent().length);
binaryContent.put(imageURL, contentCopy);
//Nullify content in binary channel
logoBinaryChannel.setContent(null);
//Resave with external content
xml = contentObject.xml(false, false);
contentObject = saveAndAssertBinaryContentIsSaved(contentObject, xml, logo, "image", binaryContent);
json = contentObject.json(false, false);
contentObject = saveAndAssertBinaryContentIsSaved(contentObject, json, logo, "image", binaryContent);
//Set custom value to 'url' attribute
xml = contentObject.xml(false, false).replaceAll(Pattern.quote(imageURL), "external-content-id");
binaryContent.put("external-content-id", contentCopy);
contentObject = saveAndAssertBinaryContentIsSaved(contentObject, xml, logo, "image", binaryContent);
json = contentObject.json(false, false).replaceAll(Pattern.quote(imageURL), "external-content-id");
binaryContent.put("external-content-id", contentCopy);
contentObject = saveAndAssertBinaryContentIsSaved(contentObject, json, logo, "image", binaryContent);
}
private ContentObject saveAndAssertBinaryContentIsSaved(ContentObject contentObject, String contentSource, File fileWhichContainsContent, String property, Map<String, byte[]> binaryContent) throws Exception {
try{
ImportConfiguration configuration = ImportConfiguration.object()
.persist(PersistMode.PERSIST_ENTITY_TREE)
.version(false)
.updateLastModificationTime(true)
.addBinaryContent(binaryContent)
.build();
contentObject = importService.importContentObject(contentSource, configuration);
//reload object
ContentObject object = contentService.getContentObject(contentObject.getId(), ResourceRepresentationType.CONTENT_OBJECT_INSTANCE,
FetchLevel.ENTITY, CacheRegion.NONE, null, false);
BinaryProperty imageProperty = (BinaryProperty)object.getCmsProperty(property);
Assert.assertTrue(imageProperty.hasValues(), "No binary channel saved for "+property+" property");
for (BinaryChannel imageBinaryChannel : imageProperty.getSimpleTypeValues()){
String sourceFilename = imageBinaryChannel.getSourceFilename();
Assert.assertTrue(StringUtils.isNotBlank(sourceFilename), " BinaryChannel "+ imageBinaryChannel.getName() + " does not have a source file name");
File fileWhoseContentsAreSavedInBinaryChannel = null;
if (sourceFilename.equals(fileWhichContainsContent.getName())){
fileWhoseContentsAreSavedInBinaryChannel = fileWhichContainsContent;
}
else {
throw new Exception("BnaryChannel contains an invalid source file name "+ sourceFilename);
}
String mimeType = new MimetypesFileTypeMap().getContentType(fileWhoseContentsAreSavedInBinaryChannel);
if (property.contains(".")){
Assert.assertEquals(imageBinaryChannel.getName(), StringUtils.substringAfterLast(property, "."));
}
else{
Assert.assertEquals(imageBinaryChannel.getName(), property);
}
Assert.assertEquals(imageBinaryChannel.getMimeType(), mimeType);
Assert.assertEquals(imageBinaryChannel.getSourceFilename(), sourceFilename);
Assert.assertEquals(imageBinaryChannel.getSize(), FileUtils.readFileToByteArray(fileWhoseContentsAreSavedInBinaryChannel).length);
Assert.assertEquals(imageBinaryChannel.getModified().getTimeInMillis(), fileWhoseContentsAreSavedInBinaryChannel.lastModified());
//Now test in jcr to see if the proper node is created
Node binaryChannelNode = getSession().getNodeByIdentifier(imageBinaryChannel.getId());
//If node is not found then exception has already been thrown
Assert.assertEquals(binaryChannelNode.getName(), imageBinaryChannel.getName(), " Invalid name for binary data jcr node "+ binaryChannelNode.getPath());
if (property.contains(".")){
Assert.assertEquals(binaryChannelNode.getProperty(CmsBuiltInItem.Name.getJcrName()).getString(), StringUtils.substringAfterLast(property, "."));
}
else{
Assert.assertEquals(binaryChannelNode.getProperty(CmsBuiltInItem.Name.getJcrName()).getString(), property);
}
Assert.assertEquals(binaryChannelNode.getProperty(JcrBuiltInItem.JcrMimeType.getJcrName()).getString(), mimeType);
Assert.assertEquals(binaryChannelNode.getProperty(CmsBuiltInItem.SourceFileName.getJcrName()).getString(), sourceFilename);
Assert.assertEquals(binaryChannelNode.getProperty(CmsBuiltInItem.Size.getJcrName()).getLong(), fileWhoseContentsAreSavedInBinaryChannel.length());
Assert.assertEquals(binaryChannelNode.getProperty(JcrBuiltInItem.JcrLastModified.getJcrName()).getDate().getTimeInMillis(), fileWhoseContentsAreSavedInBinaryChannel.lastModified());
}
}
catch(Exception e){
logger.error("Initial \n{}",contentSource);
throw e;
}
return contentObject;
}
/*
* Test for http://jira.betaconceptframework.org/browse/ASTROBOA-148
*/
@Test
public void testUpdateWithNoSystemName(){
String systemName = "testUpdateWithNoSystemName";
String title = "testUpdateWithNoSystemNameTitle";
ContentObject object = cmsRepositoryEntityFactory.newObjectForType(TEST_CONTENT_TYPE);
object.setOwner(getSystemUser());
object.setSystemName(systemName);
((StringProperty)object.getCmsProperty("profile.title")).setSimpleTypeValue(title);
((StringProperty)object.getCmsProperty("profile.language")).addSimpleTypeValue("en");
object = contentService.save(object, false, true, null);
markObjectForRemoval(object);
//remove system name and save again
object.setSystemName(null);
object = contentService.save(object, false, true, null);
Assert.assertEquals(object.getSystemName(), systemName);
//Check with xml and json
object.setSystemName(null);
object = contentService.save(object.xml(false), false, true, null);
Assert.assertEquals(object.getSystemName(), systemName);
object.setSystemName(null);
object = contentService.save(object.json(false), false, true, null);
Assert.assertEquals(object.getSystemName(), systemName);
}
@Test
public void testSavePersonObjectFromJSON(){
loginToRepositoryRepresentingIdentityStoreAsSystem();
ContentObjectCriteria contentObjectCriteria = CmsCriteriaFactory.newContentObjectCriteria("personObject");
contentObjectCriteria.setCacheable(CacheRegion.NONE);
contentObjectCriteria.addSystemNameEqualsCriterion("IDENTITY_STORE_SYSTEM_PERSON");
CmsOutcome<ContentObject> outcome = contentService.searchContentObjects(contentObjectCriteria, ResourceRepresentationType.CONTENT_OBJECT_LIST);
for (ContentObject person : outcome.getResults()){
contentService.save(person.json(true), false, false, null);
contentService.save(person.json(false), false, false, null);
}
loginToTestRepositoryAsSystem();
}
@Test
public void testSaveWithNoAccessibility(){
ContentObject object = cmsRepositoryEntityFactory.newObjectForType(TEST_CONTENT_TYPE);
object.setOwner(getSystemUser());
object.setSystemName(TestUtils.createValidSystemName("testEmptyAccessibility"));
((StringProperty)object.getCmsProperty("profile.title")).setSimpleTypeValue(object.getSystemName());
((StringProperty)object.getCmsProperty("profile.language")).addSimpleTypeValue("en");
//New object
object = contentService.save(object, false, true, null);
markObjectForRemoval(object);
assertAccessibilityProperty(object, "accessibility.canBeReadBy");
assertAccessibilityProperty(object, "accessibility.canBeUpdatedBy");
assertAccessibilityProperty(object, "accessibility.canBeDeletedBy");
assertAccessibilityProperty(object, "accessibility.canBeTaggedBy");
//Update one accessibility property
StringProperty accessibilityProperty = (StringProperty)object.getCmsProperty("accessibility.canBeUpdatedBy");
accessibilityProperty.removeValues();
String expectedValue = CmsRoleAffiliationFactory.INSTANCE.getCmsRoleAffiliationForActiveRepository(CmsRole.ROLE_CMS_EDITOR);
accessibilityProperty.addSimpleTypeValue(expectedValue);
object = contentService.save(object, false, true, null);
//Reload object and resave with no accessibility
object = contentService.getContentObject(object.getSystemName(), ResourceRepresentationType.CONTENT_OBJECT_INSTANCE, FetchLevel.ENTITY,
CacheRegion.NONE, null, false);
//Save again
object = contentService.save(object, false, true, null);
//And now check accessibility properties
accessibilityProperty = (StringProperty)object.getCmsProperty("accessibility.canBeUpdatedBy");
Assert.assertNotNull(accessibilityProperty, "Property accessibility.canBeUpdatedBy was not saved ");
Assert.assertTrue(accessibilityProperty.hasValues() && accessibilityProperty.getSimpleTypeValues().size() ==1 , " Property accessibility.canBeUpdatedBy does not contain one value "+ accessibilityProperty.getSimpleTypeValues());
Assert.assertTrue(expectedValue.equals(accessibilityProperty.getFirstValue()), "Property accessibility.canBeUpdatedBy contains invalid value. Expected "+expectedValue + " but found "+accessibilityProperty.getFirstValue());
}
private void assertAccessibilityProperty(ContentObject object, String property){
StringProperty accessibilityProperty = (StringProperty)object.getCmsProperty(property);
Assert.assertNotNull(accessibilityProperty, "Accessibility property "+property+" was not saved ");
String defaultValue = accessibilityProperty.getPropertyDefinition().getDefaultValue();
Assert.assertEquals(accessibilityProperty.getFirstValue(), defaultValue, "Accessibility property "+property+" was not saved with the default value "+defaultValue);
}
@Test
public void testSaveWithNoOwner(){
ContentObject object = createContentObjectForType("genericContentResourceObject", null, "testEmptyOwner");
//New object
object = contentService.save(object, false, true, null);
markObjectForRemoval(object);
Assert.assertNotNull(object.getOwner(), "Object was saved but owner is null");
repositoryContentValidator.compareRepositoryUsers(object.getOwner(), getSystemUser(), false, false);
//Update object
object.setOwner(null);
object = contentService.save(object, false, true, null);
Assert.assertNotNull(object.getOwner(), "Object was saved but owner is null");
repositoryContentValidator.compareRepositoryUsers(object.getOwner(), getSystemUser(), false, false);
//Save object as another user
loginToTestRepositoryAsTestUser();
try{
//Suppress warnings
TestLogPolicy.setLevelForLogger(Level.FATAL, SecureContentObjectSaveAspect.class.getName());
object = contentService.save(object, false, true, null);
TestLogPolicy.setDefaultLevelForLogger(SecureContentObjectSaveAspect.class.getName());
}
catch(CmsException e){
Assert.assertTrue(e instanceof CmsUnauthorizedAccessException, "Invalid exception thrown for unauthorized access "+e);
Assert.assertTrue(e.getMessage().startsWith("User "+TestConstants.TEST_USER_NAME+" is not authorized to save content object"), "Invalid exception message thrown for unauthorized access");
}
//Now update accessibility in order to allow save
loginToTestRepositoryAsSystem();
object = contentService.getContentObject(object.getSystemName(), ResourceRepresentationType.CONTENT_OBJECT_INSTANCE, FetchLevel.ENTITY, CacheRegion.NONE, null, false);
((StringProperty)object.getCmsProperty("accessibility.canBeUpdatedBy")).addSimpleTypeValue(TestConstants.TEST_USER_NAME);
object = contentService.save(object, false, true, null);
loginToTestRepositoryAsTestUser();
object.setOwner(null);
object = contentService.save(object, false, true, null);
Assert.assertNotNull(object.getOwner(), "Object was saved but owner is null");
repositoryContentValidator.compareRepositoryUsers(object.getOwner(), getSystemUser(), false, false);
loginToTestRepositoryAsSystem();
}
@Test
public void testContainsInSearch() throws Throwable{
RepositoryUser systemUser = getSystemUser();
ContentObject contentObject = createContentObject(systemUser,"testContains");
//Add text in a first level property
((StringProperty)contentObject.getCmsProperty("simpleString")).addSimpleTypeValue("Text in first level property");
//Add text in a second level property
((StringProperty)contentObject.getCmsProperty("profile.title")).setSimpleTypeValue("Title for contains search");
//Add text in a third level property
((StringProperty)contentObject.getCmsProperty("commentSingle.body")).setSimpleTypeValue("New Comment");
//Add text in a fourth level property
((StringProperty)contentObject.getCmsProperty("commentSingle.comment.body")).setSimpleTypeValue("Text in a fourth level property");
contentObject = contentService.save(contentObject, false, true, null);
markObjectForRemoval(contentObject);
Node contentObjectNode = getSession().getNodeByIdentifier(contentObject.getId());
assertContainsInSearch(contentObject, contentObjectNode, "firs");
assertContainsInSearch(contentObject, contentObjectNode, "conta");
assertContainsInSearch(contentObject, contentObjectNode, "comm");
assertContainsInSearch(contentObject, contentObjectNode, "fourth");
}
private void assertContainsInSearch(ContentObject contentObject,
Node contentObjectNode, String searchText)
throws RepositoryException {
ContentObjectCriteria contentObjectCriteria = CmsCriteriaFactory.newContentObjectCriteria();
contentObjectCriteria.addFullTextSearchCriterion(searchText+"*");
CmsOutcome<ContentObject> outcome = contentService.searchContentObjects(contentObjectCriteria, ResourceRepresentationType.CONTENT_OBJECT_LIST);
Assert.assertEquals(outcome.getCount(), 1, "Invalid total count for query " + contentObjectCriteria.getXPathQuery()+"\n JcrNode expecting to match "+JcrUtils.dumpNode(contentObjectNode, 0)
+ " Matched objects "+ outcomeToXml(outcome));
ContentObject coReturned= outcome.getResults().get(0);
Assert.assertEquals(coReturned.getSystemName(), contentObject.getSystemName(), "Invalid object in search results");
}
private String outcomeToXml(CmsOutcome<ContentObject> outcome) {
StringBuilder sb= new StringBuilder();
if (outcome != null && outcome.getCount() >0){
for (ContentObject co : outcome.getResults()){
sb.append(co.xml(true)).append("\n");
}
}
else{
sb.append("Outcome return no results");
}
return sb.toString();
}
@Test
public void testRankingInSearch() throws Throwable{
RepositoryUser systemUser = getSystemUser();
for (int i=0;i<10;i++){
ContentObject contentObject = createContentObject(systemUser,"testRankingIn"+i);
((StringProperty)contentObject.getCmsProperty("profile.title")).setSimpleTypeValue("testRankingInSearch"+i);
//Default values will be loaded
contentObject.getCmsProperty("stringEnum");
contentObject.getCmsProperty("longEnum");
contentObject = contentService.save(contentObject, false, true, null);
markObjectForRemoval(contentObject);
}
ContentObjectCriteria contentObjectCriteria = CmsCriteriaFactory.newContentObjectCriteria();
contentObjectCriteria.addCriterion(CriterionFactory.contains("profile.title", "testRank*"));
contentObjectCriteria.addOrderProperty("profile.title", Order.ascending);
CmsOutcome<ContentObject> outcome = contentService.searchContentObjects(contentObjectCriteria, ResourceRepresentationType.CONTENT_OBJECT_LIST);
for (ContentObject co: outcome.getResults()){
Assert.assertTrue(outcome.getRanking(co) > 1.0, "Invalid ranking in search results for object "+co.getSystemName());
}
contentObjectCriteria = CmsCriteriaFactory.newContentObjectCriteria();
contentObjectCriteria.addCriterion(CriterionFactory.equals("profile.title", "testRankingIn1"));
contentObjectCriteria.addOrderProperty("profile.title", Order.ascending);
outcome = contentService.searchContentObjects(contentObjectCriteria, ResourceRepresentationType.CONTENT_OBJECT_LIST);
for (ContentObject co: outcome.getResults()){
Assert.assertEquals(outcome.getRanking(co), 0.0, "Invalid ranking in search results for object "+co.getSystemName());
}
}
@Test
public void testBatchSave(){
//Create content objects for test
RepositoryUser systemUser = getSystemUser();
Topic topic = JAXBTestUtils.createTopic("topic-used-for-batch-save",
CmsRepositoryEntityFactoryForActiveClient.INSTANCE.getFactory().newTopic(),systemUser);
topic.setTaxonomy(getSubjectTaxonomy());
ContentObject contentObject1 = createContentObject(systemUser, "test-batch-save-1");
((StringProperty)contentObject1.getCmsProperty("singleComplexNotAspectWithCommonAttributes.additionalName")).setSimpleTypeValue("Test");
((TopicReferenceProperty)contentObject1.getCmsProperty("singleComplexNotAspectWithCommonAttributes.testTopic")).addSimpleTypeValue(topic);
contentObject1 = contentService.save(contentObject1, false, true, null);
//Topic has been saved along with object save
markTopicForRemoval(topicService.getTopic(topic.getName(), ResourceRepresentationType.TOPIC_INSTANCE, FetchLevel.ENTITY, false));
markObjectForRemoval(contentObject1);
ContentObject contentObject2 = createContentObject(systemUser, "test-batch-save-2");
((StringProperty)contentObject2.getCmsProperty("singleComplexNotAspectWithCommonAttributes.additionalName")).setSimpleTypeValue("Test");
((TopicReferenceProperty)contentObject2.getCmsProperty("singleComplexNotAspectWithCommonAttributes.testTopic")).addSimpleTypeValue(topic);
contentObject2 = contentService.save(contentObject2, false, true, null);
markObjectForRemoval(contentObject2);
//Retrieve both objects as resource collection (XML and JSON)
ContentObjectCriteria contentObjectCriteria = CmsCriteriaFactory.newContentObjectCriteria();
contentObjectCriteria.addSystemNameEqualsAnyCriterion(Arrays.asList("test-batch-save-1","test-batch-save-2"));
contentObjectCriteria.doNotCacheResults();
String xmlResourceCollection = contentService.searchContentObjects(contentObjectCriteria, ResourceRepresentationType.XML);
//change some values
String newTitle = "xml-batch-save";
xmlResourceCollection = xmlResourceCollection.replaceAll("test-batch-save", newTitle);
//Try o save resource collection
List<ContentObject> contentObjects = contentService.saveContentObjectResourceCollection(xmlResourceCollection, false, true, null);
assertBatchSaveResults(contentObject1, contentObject2, newTitle, contentObjects);
//Retrieve objects using criteria
contentObjectCriteria = CmsCriteriaFactory.newContentObjectCriteria();
contentObjectCriteria.addSystemNameEqualsAnyCriterion(Arrays.asList(newTitle+"-1",newTitle+"-2"));
contentObjectCriteria.doNotCacheResults();
CmsOutcome<ContentObject> outcome = contentService.searchContentObjects(contentObjectCriteria, ResourceRepresentationType.CONTENT_OBJECT_LIST);
assertBatchSaveResults(contentObject1, contentObject2, newTitle, outcome.getResults());
//Using JSON
String newJSONTitle = "json-batch-save";
String jsonResourceCollection = contentService.searchContentObjects(contentObjectCriteria, ResourceRepresentationType.JSON);
jsonResourceCollection = jsonResourceCollection.replaceAll(newTitle, newJSONTitle);
//Try o save resource collection
contentObjects = contentService.saveContentObjectResourceCollection(jsonResourceCollection, false, true, null);
assertBatchSaveResults(contentObject1, contentObject2, newJSONTitle, contentObjects);
//Retrieve objects using criteria
contentObjectCriteria = CmsCriteriaFactory.newContentObjectCriteria();
contentObjectCriteria.addSystemNameEqualsAnyCriterion(Arrays.asList(newJSONTitle+"-1",newJSONTitle+"-2"));
contentObjectCriteria.doNotCacheResults();
outcome = contentService.searchContentObjects(contentObjectCriteria, ResourceRepresentationType.CONTENT_OBJECT_LIST);
assertBatchSaveResults(contentObject1, contentObject2, newJSONTitle, outcome.getResults());
//Using Content Object instances
String newInstanceTitle = "instance-batch-save";
CmsOutcome<ContentObject> contentObjectList = contentService.searchContentObjects(contentObjectCriteria, ResourceRepresentationType.CONTENT_OBJECT_LIST);
for (ContentObject co: contentObjectList.getResults()){
co.setSystemName(co.getSystemName().replaceAll(newJSONTitle, newInstanceTitle));
StringProperty titleProperty = ((StringProperty)co.getCmsProperty("profile.title"));
titleProperty.setSimpleTypeValue(titleProperty.getSimpleTypeValue().replaceAll(newJSONTitle, newInstanceTitle));
}
//Try o save resource collection
contentObjects = contentService.saveContentObjectResourceCollection(contentObjectList.getResults(), false, true, null);
assertBatchSaveResults(contentObject1, contentObject2, newInstanceTitle, contentObjects);
//Retrieve objects using criteria
contentObjectCriteria = CmsCriteriaFactory.newContentObjectCriteria();
contentObjectCriteria.addSystemNameEqualsAnyCriterion(Arrays.asList(newInstanceTitle+"-1",newInstanceTitle+"-2"));
contentObjectCriteria.doNotCacheResults();
outcome = contentService.searchContentObjects(contentObjectCriteria, ResourceRepresentationType.CONTENT_OBJECT_LIST);
assertBatchSaveResults(contentObject1, contentObject2, newInstanceTitle, outcome.getResults());
}
private void assertBatchSaveResults(ContentObject contentObject1,
ContentObject contentObject2, String newTitle,
List<ContentObject> contentObjects) {
Assert.assertEquals(contentObjects.size(), 2, "Invalid batch save result list size");
for (ContentObject contentObject :contentObjects){
if (contentObject.getId().equals(contentObject1.getId())){
Assert.assertEquals(contentObject.getSystemName(),newTitle+"-1", "Invalid system name.");
Assert.assertEquals(((StringProperty)contentObject.getCmsProperty("profile.title")).getSimpleTypeValue(),newTitle+"-1", "Invalid system name.");
}
else if (contentObject.getId().equals(contentObject2.getId())){
Assert.assertEquals(contentObject.getSystemName(),newTitle+"-2", "Invalid system name.");
Assert.assertEquals(((StringProperty)contentObject.getCmsProperty("profile.title")).getSimpleTypeValue(),newTitle+"-2", "Invalid system name.");
}
else{
Assert.assertTrue(1==2, "Invalid content object"+ contentObject.toString()+". Expected "+contentObject1.toString() +" or "+contentObject2.toString());
}
}
}
@Test
public void testDeleteContentObjectWithTopicAndSpaceReference() throws ItemNotFoundException, RepositoryException{
//Create topic
Topic topic = JAXBTestUtils.createTopic("topic-reference",
CmsRepositoryEntityFactoryForActiveClient.INSTANCE.getFactory().newTopic(),
getSystemUser());
topic = topicService.save(topic);
markTopicForRemoval(topic);
//Create content object
ContentObject contentObject = createContentObject(getSystemUser(), "test-delete-with-topic-and-space-reference");
((TopicReferenceProperty)contentObject.getCmsProperty("profile.subject")).addSimpleTypeValue(topic);
contentObject = contentService.save(contentObject, false, true, null);
//Create space
Space space = createRootSpaceForOrganizationSpace("space-reference");
space.addContentObjectReference(contentObject.getId());
space = spaceService.save(space);
//Delete content object
contentService.deleteContentObject(contentObject.getId());
//Check with Jcr
try{
Node contentObjectNode = getSession().getNodeByIdentifier(contentObject.getId());
Assert.assertNull(contentObjectNode, "ContentObject "+contentObject.getSystemName() + " was not deleted");
}
catch(ItemNotFoundException infe){
Assert.assertEquals(infe.getMessage(), contentObject.getId(), "Invalid ItemNotFoundException message");
}
//Check with ContentObject entity
ContentObject contentObjectReloaded = contentService.getContentObject(contentObject.getId(), ResourceRepresentationType.CONTENT_OBJECT_INSTANCE, FetchLevel.ENTITY, CacheRegion.NONE, null, false);
Assert.assertNull(contentObjectReloaded, "ContentObject "+contentObject.getSystemName() + " was not deleted");
//Check with Topic entity
Topic topicReloaded = topicService.getTopic(topic.getId(), ResourceRepresentationType.TOPIC_INSTANCE, FetchLevel.ENTITY_AND_CHILDREN, false);
Assert.assertEquals(topicReloaded.getContentObjectIdsWhichReferToThisTopic().size(), 0, "Topic "+topic.getName() + " should have been updated since content object has been deleted. "+topicReloaded.getContentObjectIdsWhichReferToThisTopic());
Assert.assertEquals(topicReloaded.getNumberOfContentObjectsWhichReferToThisTopic(), 0, "Topic "+topic.getName() + " should have been updated since content object has been deleted");
//Check with Astroboa Service
List<String> contentObjectReferencesList = topicService.getContentObjectIdsWhichReferToTopic(topicReloaded.getId());
Assert.assertEquals(contentObjectReferencesList.size(), 0, "Topic "+topic.getName() + " should have been updated since content object has been deleted");
Assert.assertEquals(topicService.getCountOfContentObjectIdsWhichReferToTopic(topicReloaded.getId()), 0, "Topic "+topic.getName() + " should have been updated since content object has been deleted");
//Check with space entity
//Check with Jcr
Node spaceNode = getSession().getNodeByIdentifier(space.getId());
Assert.assertNotNull(spaceNode, "Space "+space.getName() + " was not saved at all");
Assert.assertFalse(spaceNode.hasProperty(CmsBuiltInItem.ContentObjectReferences.getJcrName()), "Space "+space.getName() + " was saved but reference to content object was not");
//Check with Space entity
Space spaceReloaded = spaceService.getSpace(space.getId(), ResourceRepresentationType.SPACE_INSTANCE, FetchLevel.ENTITY_AND_CHILDREN);
Assert.assertNotNull(spaceReloaded, "Space "+space.getName() + " was not saved at all");
Assert.assertEquals(spaceReloaded.getContentObjectReferences().size(), 0, "Space "+space.getName() + " should have been updated since content object has been deleted");
Assert.assertEquals(spaceReloaded.getNumberOfContentObjectReferences(), 0, "Space "+space.getName() + " should have been updated since content object has been deleted");
//Check with Astroboa Service
contentObjectReferencesList = spaceService.getContentObjectIdsWhichResideInSpace(spaceReloaded.getId());
Assert.assertEquals(contentObjectReferencesList.size(), 0, "Space "+space.getName() + " should have been updated since content object has been deleted");
Assert.assertEquals(spaceService.getCountOfContentObjectIdsWhichResideInSpace(spaceReloaded.getId()), 0, "Space "+space.getName() + " should have been updated since content object has been deleted");
}
@Test
public void testContentObjectExportOfComplexWithCommonAttributes() throws Exception{
//Create content objects for test
RepositoryUser systemUser = getSystemUser();
Topic topic = JAXBTestUtils.createTopic("co3Topic",
CmsRepositoryEntityFactoryForActiveClient.INSTANCE.getFactory().newTopic(),systemUser);
topic.setTaxonomy(getSubjectTaxonomy());
ContentObject contentObject = createContentObject(systemUser, "test-export-with-complex-with-id");
((StringProperty)contentObject.getCmsProperty("singleComplexNotAspectWithCommonAttributes.additionalName")).setSimpleTypeValue("Test");
((TopicReferenceProperty)contentObject.getCmsProperty("singleComplexNotAspectWithCommonAttributes.testTopic")).addSimpleTypeValue(topic);
contentObject = contentService.save(contentObject, false, true, null);
markTopicForRemoval(topicService.getTopic(topic.getName(), ResourceRepresentationType.TOPIC_INSTANCE, FetchLevel.ENTITY, false));
markObjectForRemoval(contentObject);
//Retrieve content object
contentObject = contentService.getContentObject(contentObject.getId(), ResourceRepresentationType.CONTENT_OBJECT_INSTANCE,
FetchLevel.FULL, CacheRegion.NONE, Arrays.asList("singleComplexNotAspectWithCommonAttributes.additionalName", "singleComplexNotAspectWithCommonAttributes.testTopic"), false);
ComplexCmsProperty singleComplexNotAspectWithCommonAttributesProperty = (ComplexCmsProperty) contentObject.getCmsProperty("singleComplexNotAspectWithCommonAttributes");
//Export to xml and JSON using all possible methods and check if common attributes are exported
String xmlExportExpectedToBeFound = "<singleComplexNotAspectWithCommonAttributes cmsIdentifier=\""+singleComplexNotAspectWithCommonAttributesProperty.getId()+"\"";
String xmlExportExpectedToBeFoundWithoutWhitespaces = removeWhitespacesIfNecessary(xmlExportExpectedToBeFound);
String jsonExportExpectedToBeFound = "\"singleComplexNotAspectWithCommonAttributes\":{\"cmsIdentifier\":\""+singleComplexNotAspectWithCommonAttributesProperty.getId()+"\"";
String jsonExportExpectedToBeFoundWithoutWhitespaces = removeWhitespacesIfNecessary(jsonExportExpectedToBeFound);
String xmlFromService = contentService.getContentObject(contentObject.getId(), ResourceRepresentationType.XML,
FetchLevel.FULL, CacheRegion.NONE, Arrays.asList("singleComplexNotAspectWithCommonAttributes", "singleComplexNotAspectWithCommonAttributes"), false);
String xmlFromServiceWithoutWhitespaces = removeWhitespacesIfNecessary(xmlFromService);
Assert.assertTrue(xmlFromServiceWithoutWhitespaces.contains(xmlExportExpectedToBeFoundWithoutWhitespaces), "Found common attributes in XML export from the ContentService of a complex property which does not define them in its schema\n"+xmlFromService);
String xmlFromObject = contentObject.xml(prettyPrint);
String xmlFromObjectWithoutWhitespaces = removeWhitespacesIfNecessary(xmlFromObject);
Assert.assertTrue(xmlFromObjectWithoutWhitespaces.contains(xmlExportExpectedToBeFoundWithoutWhitespaces), "Found common attributes in XML export from method ContentObject.xml() of a complex property which does not define them in its schema\n"+xmlFromObject);
String jsonFromService = contentService.getContentObject(contentObject.getId(), ResourceRepresentationType.JSON,
FetchLevel.FULL, CacheRegion.NONE, Arrays.asList("singleComplexNotAspectWithCommonAttributes", "singleComplexNotAspectWithCommonAttributes"), false);
String jsonFromServiceWithoutWhitespaces = removeWhitespacesIfNecessary(jsonFromService);
Assert.assertTrue(jsonFromServiceWithoutWhitespaces.contains(jsonExportExpectedToBeFoundWithoutWhitespaces), "Found common attributes in JSON export from the ContentService of a complex property which does not define them in its schema\n"+jsonFromService);
String jsonFromObject = contentObject.json(prettyPrint);
Assert.assertTrue(StringUtils.deleteWhitespace(jsonFromObject).contains(jsonExportExpectedToBeFoundWithoutWhitespaces), "Found common attributes in JSON export from method ContentObject.json() of a complex property which does not define them in its schema\n"+jsonFromObject);
}
@Test
public void testContentObjectExportOfComplexWithoutCommonAttributes() throws Exception{
//Create content objects for test
RepositoryUser systemUser = getSystemUser();
Topic topic = JAXBTestUtils.createTopic("co2Topic",
CmsRepositoryEntityFactoryForActiveClient.INSTANCE.getFactory().newTopic(),systemUser);
topic.setTaxonomy(getSubjectTaxonomy());
ContentObject contentObject = createContentObject(systemUser, "test-export-with-complex-no-id");
((StringProperty)contentObject.getCmsProperty("singleComplexNotAspectWithNoCommonAttributes.additionalName")).setSimpleTypeValue("Test");
((TopicReferenceProperty)contentObject.getCmsProperty("singleComplexNotAspectWithNoCommonAttributes.testTopic")).addSimpleTypeValue(topic);
contentObject = contentService.save(contentObject, false, true, null);
markTopicForRemoval(topicService.getTopic(topic.getName(), ResourceRepresentationType.TOPIC_INSTANCE, FetchLevel.ENTITY, false));
markObjectForRemoval(contentObject);
//Retrieve content object
contentObject = contentService.getContentObject(contentObject.getId(), ResourceRepresentationType.CONTENT_OBJECT_INSTANCE,
FetchLevel.ENTITY, CacheRegion.NONE, Arrays.asList("singleComplexNotAspectWithNoCommonAttributes.additionalName", "singleComplexNotAspectWithNoCommonAttributes.testTopic"), false);
ComplexCmsProperty singleComplexNotAspectWithNoCommonAttributesProperty = (ComplexCmsProperty) contentObject.getCmsProperty("singleComplexNotAspectWithNoCommonAttributes");
//Export to xml and JSON using all possible methods and check if common attributes are exported
String xmlExportExpectedNotToBeFound = "<singleComplexNotAspectWithNoCommonAttributes cmsIdentifier=\""+singleComplexNotAspectWithNoCommonAttributesProperty.getId()+"\"";
String jsonExportExpectedNotToBeFound = "\"singleComplexNotAspectWithNoCommonAttributes\":{\"cmsIdentifier\":\""+singleComplexNotAspectWithNoCommonAttributesProperty.getId()+"\"";
String xmlFromService = contentService.getContentObject(contentObject.getId(), ResourceRepresentationType.XML,
FetchLevel.ENTITY, CacheRegion.NONE, Arrays.asList("singleComplexNotAspectWithNoCommonAttributes", "singleComplexNotAspectWithNoCommonAttributes"), false);
Assert.assertFalse(xmlFromService.contains(xmlExportExpectedNotToBeFound), "Found common attributes in XML export from the ContentService of a complex property which does not define them in its schema\n"+xmlFromService);
String xmlFromObject = contentObject.xml(prettyPrint);
Assert.assertFalse(xmlFromObject.contains(xmlExportExpectedNotToBeFound), "Found common attributes in XML export from method ContentObject.xml() of a complex property which does not define them in its schema\n"+xmlFromObject);
String jsonFromService = contentService.getContentObject(contentObject.getId(), ResourceRepresentationType.JSON,
FetchLevel.ENTITY, CacheRegion.NONE, Arrays.asList("singleComplexNotAspectWithNoCommonAttributes", "singleComplexNotAspectWithNoCommonAttributes"), false);
Assert.assertFalse(jsonFromService.contains(jsonExportExpectedNotToBeFound), "Found common attributes in JSON export from the ContentService of a complex property which does not define them in its schema\n"+jsonFromService);
String jsonFromObject = contentObject.json(prettyPrint);
Assert.assertFalse(jsonFromObject.contains(jsonExportExpectedNotToBeFound), "Found common attributes in JSON export from method ContentObject.json() of a complex property which does not define them in its schema\n"+jsonFromObject);
}
@Test
public void testContentObjectUpdateWithSingleComplexWithNoId() throws Exception{
//Create content objects for test
RepositoryUser systemUser = getSystemUser();
Topic topic = JAXBTestUtils.createTopic("coTopic",
CmsRepositoryEntityFactoryForActiveClient.INSTANCE.getFactory().newTopic(),systemUser);
topic.setTaxonomy(getSubjectTaxonomy());
ContentObject contentObject = createContentObject(systemUser, "test-update-with-complex-no-id");
((StringProperty)contentObject.getCmsProperty("singleComplexNotAspectWithNoCommonAttributes.additionalName")).setSimpleTypeValue("Test");
((TopicReferenceProperty)contentObject.getCmsProperty("singleComplexNotAspectWithNoCommonAttributes.testTopic")).addSimpleTypeValue(topic);
contentObject = contentService.save(contentObject, false, true, null);
markTopicForRemoval(topicService.getTopic(topic.getName(), ResourceRepresentationType.TOPIC_INSTANCE, FetchLevel.ENTITY, false));
markObjectForRemoval(contentObject);
//Now retrieve content object
contentObject = contentService.getContentObject(contentObject.getId(), ResourceRepresentationType.CONTENT_OBJECT_INSTANCE,
FetchLevel.ENTITY, CacheRegion.NONE, Arrays.asList("singleComplexNotAspectWithNoCommonAttributes.additionalName", "singleComplexNotAspectWithNoCommonAttributes.testTopic"), false);
//Remove id from property and try to save it
String previousId = new String(((ComplexCmsProperty)contentObject.getCmsProperty("singleComplexNotAspectWithNoCommonAttributes")).getId());
((ComplexCmsProperty)contentObject.getCmsProperty("singleComplexNotAspectWithNoCommonAttributes")).setId(null);
contentObject = contentService.save(contentObject, false, true, null);
//Check that id has been provided.
String newId = new String(((ComplexCmsProperty)contentObject.getCmsProperty("singleComplexNotAspectWithNoCommonAttributes")).getId());
Assert.assertEquals(previousId, newId, "Single value complex property 'singleComplexNotAspectWithNoCommonAttributes' was saved with different id");
//Now reload content object to ensure that the same id is provided
contentObject = contentService.getContentObject(contentObject.getId(), ResourceRepresentationType.CONTENT_OBJECT_INSTANCE,
FetchLevel.ENTITY, CacheRegion.NONE, Arrays.asList("singleComplexNotAspectWithNoCommonAttributes.additionalName", "singleComplexNotAspectWithNoCommonAttributes.testTopic"), false);
newId = new String(((ComplexCmsProperty)contentObject.getCmsProperty("singleComplexNotAspectWithNoCommonAttributes")).getId());
Assert.assertEquals(previousId, newId, "Single value complex property 'singleComplexNotAspectWithNoCommonAttributes' was saved with different id");
}
@Test
public void testNodePathOfContentObjectSave() throws Exception{
//Create content objects for test
RepositoryUser systemUser = getSystemUser();
ContentObject contentObject = createContentObject(systemUser, "test-save-in-right-node-path");
contentObject = contentService.save(contentObject, false, true, null);
markObjectForRemoval(contentObject);
Calendar created = ((CalendarProperty)contentObject.getCmsProperty("profile.created")).getSimpleTypeValue();
CmsRepositoryEntityUtils cmsRepositoryEntityUtils = AstroboaTestContext.INSTANCE.getBean(CmsRepositoryEntityUtils.class, null);
Node contentObjectNode = cmsRepositoryEntityUtils.retrieveUniqueNodeForContentObject(getSession(), contentObject.getId());
CalendarInfo calInfo = new CalendarInfo(created);
Assert.assertTrue(contentObjectNode.getParent().getPath().endsWith(calInfo.getFullPath()), "Content object was saved under path "+contentObjectNode.getParent().getPath() +
" and not under path "+calInfo.getFullPath());
}
@Test
public void testGetContentObjectAsContentObjectOutcome() throws Throwable{
ContentObject contentObject = createContentObject(getSystemUser(), "contentObjectTestExportAsContentObjectOutcome");
contentObject = contentService.save(contentObject, false, true, null);
markObjectForRemoval(contentObject);
CmsOutcome<ContentObject> outcome = contentService.getContentObject(contentObject.getId(), ResourceRepresentationType.CONTENT_OBJECT_LIST, FetchLevel.ENTITY, CacheRegion.NONE, null,false);
Assert.assertNotNull(outcome, "ContentService.getContentObject returned null");
Assert.assertEquals(outcome.getCount(), 1, "ContentService.getContentObject returned invalid count");
Assert.assertEquals(outcome.getLimit(), 1, "ContentService.getContentObject returned invalid limit");
Assert.assertEquals(outcome.getOffset(), 0, "ContentService.getContentObject returned invalid offset");
Assert.assertEquals(outcome.getResults().size(), 1, "ContentService.getContentObject returned invalid number of ContentObjects");
Assert.assertEquals(outcome.getResults().get(0).getId(), contentObject.getId(), "ContentService.getContentObject returned invalid contentObject");
}
@Test
public void testGetContentObjectXmlorJSON() throws Throwable{
ContentObject contentObject = createContentObject(getSystemUser(), "contentObjectTestExportXmlJSON");
contentObject.getCmsProperty("stringEnum");
contentObject.getCmsProperty("longEnum");
contentObject = contentService.save(contentObject, false, true, null);
markObjectForRemoval(contentObject);
String contentObjectString = null;
String contentObjectStringFromServiceUsingId = null;
List<ResourceRepresentationType<String>> outputs = Arrays.asList(ResourceRepresentationType.JSON, ResourceRepresentationType.XML);
try{
for (ResourceRepresentationType<String> output : outputs){
//Check full export of contentObject children
contentObject = contentService.getContentObject(contentObject.getId(), ResourceRepresentationType.CONTENT_OBJECT_INSTANCE, FetchLevel.FULL, CacheRegion.NONE, null, true);
if (output.equals(ResourceRepresentationType.XML)){
contentObjectString = contentObject.xml(prettyPrint);
}
else{
contentObjectString = contentObject.json(prettyPrint);
}
contentObjectStringFromServiceUsingId = contentService.getContentObject(contentObject.getId(), output, FetchLevel.FULL,CacheRegion.NONE, null, true);
ImportConfiguration configuration = ImportConfiguration.object()
.persist(PersistMode.DO_NOT_PERSIST)
.build();
ContentObject contentObjectFromServiceWithId = importDao.importContentObject(contentObjectStringFromServiceUsingId, configuration);
repositoryContentValidator.compareContentObjects(contentObject, contentObjectFromServiceWithId, true);
}
}
catch(Throwable e){
logger.error("Initial \n{}",TestUtils.prettyPrintXml(contentObjectString));
logger.error("Using Id \n{}",TestUtils.prettyPrintXml(contentObjectStringFromServiceUsingId));
throw e;
}
}
@Test
public void testSearchUsingNumericAndDateCriterion(){
Calendar beforeObjectSave = Calendar.getInstance();
beforeObjectSave.add(Calendar.DAY_OF_MONTH, -1);
RepositoryUser systemUser = getSystemUser();
ContentObject contentObject = createContentObjectForType(TEST_CONTENT_TYPE, systemUser, "testSearchUsingNumbericCriterion");
((LongProperty)contentObject.getCmsProperty("simpleLong")).setSimpleTypeValue(Long.valueOf(5));
((LongProperty)contentObject.getCmsProperty("simpleLongMultiple")).addSimpleTypeValue(Long.valueOf(10));
((LongProperty)contentObject.getCmsProperty("integerConstrained")).setSimpleTypeValue(Long.valueOf(100));
((DoubleProperty)contentObject.getCmsProperty("simpleDouble")).setSimpleTypeValue(Double.valueOf(5));
((DoubleProperty)contentObject.getCmsProperty("simpleDoubleMultiple")).addSimpleTypeValue(Double.valueOf(10));
Calendar simpleDateTimeValue = Calendar.getInstance();
((CalendarProperty)contentObject.getCmsProperty("simpleDateTime")).setSimpleTypeValue(simpleDateTimeValue);
((CalendarProperty)contentObject.getCmsProperty("simpleDateTimeMultiple")).addSimpleTypeValue(simpleDateTimeValue);
Calendar simpleDateValue = Calendar.getInstance();
((CalendarProperty)contentObject.getCmsProperty("simpleDate")).setSimpleTypeValue(simpleDateValue);
((CalendarProperty)contentObject.getCmsProperty("simpleDateMultiple")).addSimpleTypeValue(simpleDateValue);
contentObject = contentService.save(contentObject, false, true, null);
markObjectForRemoval(contentObject);
addCriterionForPropertyAndAssertResult(contentObject.getSystemName(), "simpleLong=\"5\"");
addCriterionForPropertyAndAssertResult(contentObject.getSystemName(), "simpleLong!=\"4\"");
addCriterionForPropertyAndAssertResult(contentObject.getSystemName(), "simpleLong>=\"5\"");
addCriterionForPropertyAndAssertResult(contentObject.getSystemName(), "simpleLong>\"4\"");
addCriterionForPropertyAndAssertResult(contentObject.getSystemName(), "simpleLong<=\"5\"");
addCriterionForPropertyAndAssertResult(contentObject.getSystemName(), "simpleLong<\"6\"");
addCriterionForPropertyAndAssertResult(contentObject.getSystemName(), "simpleLongMultiple=\"10\"");
addCriterionForPropertyAndAssertResult(contentObject.getSystemName(), "simpleLongMultiple!=\"9\"");
addCriterionForPropertyAndAssertResult(contentObject.getSystemName(), "simpleLongMultiple>=\"10\"");
addCriterionForPropertyAndAssertResult(contentObject.getSystemName(), "simpleLongMultiple>\"9\"");
addCriterionForPropertyAndAssertResult(contentObject.getSystemName(), "simpleLongMultiple<=\"10\"");
addCriterionForPropertyAndAssertResult(contentObject.getSystemName(), "simpleLongMultiple<\"11\"");
addCriterionForPropertyAndAssertResult(contentObject.getSystemName(), "simpleDouble=\"5.0\"");
addCriterionForPropertyAndAssertResult(contentObject.getSystemName(), "simpleDouble!=\"4.0\"");
addCriterionForPropertyAndAssertResult(contentObject.getSystemName(), "simpleDouble>=\"5.0\"");
addCriterionForPropertyAndAssertResult(contentObject.getSystemName(), "simpleDouble>\"4.0\"");
addCriterionForPropertyAndAssertResult(contentObject.getSystemName(), "simpleDouble<=\"5.0\"");
addCriterionForPropertyAndAssertResult(contentObject.getSystemName(), "simpleDouble<\"6.0\"");
addCriterionForPropertyAndAssertResult(contentObject.getSystemName(), "simpleDoubleMultiple=\"10.0\"");
addCriterionForPropertyAndAssertResult(contentObject.getSystemName(), "simpleDoubleMultiple!=\"9.0\"");
addCriterionForPropertyAndAssertResult(contentObject.getSystemName(), "simpleDoubleMultiple>=\"10.0\"");
addCriterionForPropertyAndAssertResult(contentObject.getSystemName(), "simpleDoubleMultiple>\"9.0\"");
addCriterionForPropertyAndAssertResult(contentObject.getSystemName(), "simpleDoubleMultiple<=\"10.0\"");
addCriterionForPropertyAndAssertResult(contentObject.getSystemName(), "simpleDoubleMultiple<\"11.0\"");
addCriterionForPropertyAndAssertResult(contentObject.getSystemName(), "integerConstrained=\"100\"");
addCriterionForPropertyAndAssertResult(contentObject.getSystemName(), "integerConstrained!=\"4\"");
addCriterionForPropertyAndAssertResult(contentObject.getSystemName(), "integerConstrained>=\"100\"");
addCriterionForPropertyAndAssertResult(contentObject.getSystemName(), "integerConstrained>\"99\"");
addCriterionForPropertyAndAssertResult(contentObject.getSystemName(), "integerConstrained<=\"100\"");
addCriterionForPropertyAndAssertResult(contentObject.getSystemName(), "integerConstrained<\"101\"");
Calendar afterObjectSave = Calendar.getInstance();
afterObjectSave.add(Calendar.DAY_OF_MONTH, 2);
addCriterionForPropertyAndAssertResult(contentObject.getSystemName(), "simpleDateTime=\""+XPathUtils.formatForQuery(simpleDateTimeValue)+"\"");
addCriterionForPropertyAndAssertResult(contentObject.getSystemName(), "simpleDateTime>\""+XPathUtils.formatForQuery(beforeObjectSave)+"\"");
addCriterionForPropertyAndAssertResult(contentObject.getSystemName(), "simpleDateTime>=\""+XPathUtils.formatForQuery(simpleDateTimeValue)+"\"");
addCriterionForPropertyAndAssertResult(contentObject.getSystemName(), "simpleDateTime>=\""+XPathUtils.formatForQuery(beforeObjectSave)+"\"");
addCriterionForPropertyAndAssertResult(contentObject.getSystemName(), "simpleDateTime<\""+XPathUtils.formatForQuery(afterObjectSave)+"\"");
addCriterionForPropertyAndAssertResult(contentObject.getSystemName(), "simpleDateTime<=\""+XPathUtils.formatForQuery(simpleDateTimeValue)+"\"");
addCriterionForPropertyAndAssertResult(contentObject.getSystemName(), "simpleDateTime<=\""+XPathUtils.formatForQuery(afterObjectSave)+"\"");
addCriterionForPropertyAndAssertResult(contentObject.getSystemName(), "simpleDateTimeMultiple=\""+XPathUtils.formatForQuery(simpleDateTimeValue)+"\"");
addCriterionForPropertyAndAssertResult(contentObject.getSystemName(), "simpleDateTimeMultiple>\""+XPathUtils.formatForQuery(beforeObjectSave)+"\"");
addCriterionForPropertyAndAssertResult(contentObject.getSystemName(), "simpleDateTimeMultiple>=\""+XPathUtils.formatForQuery(simpleDateTimeValue)+"\"");
addCriterionForPropertyAndAssertResult(contentObject.getSystemName(), "simpleDateTimeMultiple>=\""+XPathUtils.formatForQuery(beforeObjectSave)+"\"");
addCriterionForPropertyAndAssertResult(contentObject.getSystemName(), "simpleDateTimeMultiple<\""+XPathUtils.formatForQuery(afterObjectSave)+"\"");
addCriterionForPropertyAndAssertResult(contentObject.getSystemName(), "simpleDateTimeMultiple<=\""+XPathUtils.formatForQuery(simpleDateTimeValue)+"\"");
addCriterionForPropertyAndAssertResult(contentObject.getSystemName(), "simpleDateTimeMultiple<=\""+XPathUtils.formatForQuery(afterObjectSave)+"\"");
addCriterionForPropertyAndAssertResult(contentObject.getSystemName(), "simpleDate=\""+XPathUtils.formatForQuery(simpleDateValue)+"\"");
addCriterionForPropertyAndAssertResult(contentObject.getSystemName(), "simpleDate>\""+XPathUtils.formatForQuery(beforeObjectSave)+"\"");
addCriterionForPropertyAndAssertResult(contentObject.getSystemName(), "simpleDate>=\""+XPathUtils.formatForQuery(simpleDateValue)+"\"");
addCriterionForPropertyAndAssertResult(contentObject.getSystemName(), "simpleDate>=\""+XPathUtils.formatForQuery(beforeObjectSave)+"\"");
addCriterionForPropertyAndAssertResult(contentObject.getSystemName(), "simpleDate<\""+XPathUtils.formatForQuery(afterObjectSave)+"\"");
addCriterionForPropertyAndAssertResult(contentObject.getSystemName(), "simpleDate<=\""+XPathUtils.formatForQuery(simpleDateValue)+"\"");
addCriterionForPropertyAndAssertResult(contentObject.getSystemName(), "simpleDate<=\""+XPathUtils.formatForQuery(afterObjectSave)+"\"");
addCriterionForPropertyAndAssertResult(contentObject.getSystemName(), "simpleDateMultiple=\""+XPathUtils.formatForQuery(simpleDateValue)+"\"");
addCriterionForPropertyAndAssertResult(contentObject.getSystemName(), "simpleDateMultiple>\""+XPathUtils.formatForQuery(beforeObjectSave)+"\"");
addCriterionForPropertyAndAssertResult(contentObject.getSystemName(), "simpleDateMultiple>=\""+XPathUtils.formatForQuery(simpleDateValue)+"\"");
addCriterionForPropertyAndAssertResult(contentObject.getSystemName(), "simpleDateMultiple>=\""+XPathUtils.formatForQuery(beforeObjectSave)+"\"");
addCriterionForPropertyAndAssertResult(contentObject.getSystemName(), "simpleDateMultiple<\""+XPathUtils.formatForQuery(afterObjectSave)+"\"");
addCriterionForPropertyAndAssertResult(contentObject.getSystemName(), "simpleDateMultiple<=\""+XPathUtils.formatForQuery(simpleDateValue)+"\"");
addCriterionForPropertyAndAssertResult(contentObject.getSystemName(), "simpleDateMultiple<=\""+XPathUtils.formatForQuery(afterObjectSave)+"\"");
}
private void addCriterionForPropertyAndAssertResult(String systemName,String expression) {
ContentObjectCriteria contentObjectCriteria = CmsCriteriaFactory.newContentObjectCriteria(TEST_CONTENT_TYPE);
contentObjectCriteria.addSystemNameEqualsCriterion(systemName);
CriterionFactory.parse(expression, contentObjectCriteria);
assertResult(contentObjectCriteria, 1, systemName);
}
@Test
public void testEmptyComplexCmsPropertySave() throws ItemNotFoundException, RepositoryException{
RepositoryUser systemUser = getSystemUser();
ContentObject contentObject = createContentObjectForType("genericContentResourceObject", systemUser, "testEmptyComplexCmsPropertySave");
//Create an empty complex property
ComplexCmsProperty workflow = (ComplexCmsProperty) contentObject.getCmsProperty("workflow");
//Save object
contentObject = contentService.save(contentObject, false, true, null);
markObjectForRemoval(contentObject);
Assert.assertNull(workflow.getId(), "Empty complex property has an identifier where it should not have" );
((StringProperty)workflow.getChildProperty("managedThroughWorkflow")).addSimpleTypeValue("webPublishing");
contentObject = contentService.save(contentObject, false, true, null);
Assert.assertNotNull(workflow.getId(), "Complex property 'worklfow' does not have an identifier where it should have" );
//Now delete workflow.managedWorkflow
((StringProperty)workflow.getChildProperty("managedThroughWorkflow")).removeValues();
contentObject = contentService.save(contentObject, false, true, null);
Assert.assertNull(workflow.getId(), "Complex property 'worklfow' has an identifier where it should not have" );
}
@Test
public void testSaveWithEmptyWebPublication(){
RepositoryUser systemUser = getSystemUser();
ContentObject contentObject = createContentObjectForType("genericContentResourceObject", systemUser, "testEmptyWebPublication");
((BooleanProperty)contentObject.getCmsProperty("webPublication.publishCreatorName")).setSimpleTypeValue(false);
contentObject = contentService.save(contentObject, false, true, null);
markObjectForRemoval(contentObject);
try{
((BooleanProperty)contentObject.getCmsProperty("webPublication.publishCreatorName")).setSimpleTypeValue(true);
contentObject = contentService.save(contentObject, false, true, null);
}
catch(CmsException e){
Assert.assertTrue(e.getMessage() != null && e.getMessage().contains("There are some mandatory children of the property genericContentResourceObject.webPublication which need to be saved but they do not have any value. There is at least one child property which can be saved without any problem"));
contentObject = contentService.getContentObject(contentObject.getId(), ResourceRepresentationType.CONTENT_OBJECT_INSTANCE, FetchLevel.ENTITY, CacheRegion.NONE, null, false);
}
((CalendarProperty)contentObject.getCmsProperty("webPublication.webPublicationStartDate")).setSimpleTypeValue(Calendar.getInstance());
((BooleanProperty)contentObject.getCmsProperty("webPublication.publishCreatorName")).setSimpleTypeValue(false);
contentObject = contentService.save(contentObject, false, true, null);
}
@Test
public void testCopy(){
RepositoryUser systemUser = getSystemUser();
ContentObject contentObject = createContentObject(systemUser, "testCopy");
contentObject = contentService.save(contentObject, false, true, null);
markObjectForRemoval(contentObject);
ContentObject thirdContentObject = null;
for (int i=0;i<5;i++){
ContentObject clonedContentObject = contentService.copyContentObject(contentObject.getId());
clonedContentObject = contentService.save(clonedContentObject, false, true, null);
markObjectForRemoval(clonedContentObject);
Assert.assertFalse(clonedContentObject.getId().equals(contentObject.getId()), "Identifiers should not be the same");
assertPropertiesAreTheSame(contentObject.getComplexCmsRootProperty(), clonedContentObject.getComplexCmsRootProperty());
if (i==2){
thirdContentObject = clonedContentObject;
}
}
for (int i=5;i<10;i++){
ContentObject clonedContentObject = contentService.copyContentObject(thirdContentObject.getId());
clonedContentObject = contentService.save(clonedContentObject, false, true, null);
markObjectForRemoval(clonedContentObject);
Assert.assertFalse(clonedContentObject.getId().equals(contentObject.getId()), "Identifiers should not be the same");
assertPropertiesAreTheSame(contentObject.getComplexCmsRootProperty(), clonedContentObject.getComplexCmsRootProperty());
}
}
private void assertPropertiesAreTheSame(ComplexCmsProperty sourceComplexCmsProperty, ComplexCmsProperty copyComplexCmsProperty){
Assert.assertFalse(sourceComplexCmsProperty.getId().equals(copyComplexCmsProperty.getId()), "Identifiers should not be the same "+ sourceComplexCmsProperty.getPath());
Assert.assertFalse(((LazyCmsProperty) sourceComplexCmsProperty).getPropertyContainerUUID().equals(((LazyCmsProperty) copyComplexCmsProperty).getPropertyContainerUUID()), "Property Container UUID should not be the same "+ sourceComplexCmsProperty.getPath());
Assert.assertFalse(((LazyCmsProperty) sourceComplexCmsProperty).getContentObjectNodeUUID().equals(((LazyCmsProperty) copyComplexCmsProperty).getPropertyContainerUUID()), "ContentObject Node UUID should not be the same "+ sourceComplexCmsProperty.getPath());
}
@Test
public void testProfileModifiedChangedUponSave()
{
RepositoryUser systemUser = getSystemUser();
ContentObject contentObject = createContentObject(systemUser, "testLastModifiedChange");
contentObject = contentService.save(contentObject, false, true, null);
markObjectForRemoval(contentObject);
Calendar lastModified = ((CalendarProperty)contentObject.getCmsProperty("profile.modified")).getSimpleTypeValue();
//Resaved object without changing lastModified Date
contentObject = contentService.save(contentObject, false, false, null);
Calendar newLastModified = ((CalendarProperty)contentObject.getCmsProperty("profile.modified")).getSimpleTypeValue();
Assert.assertEquals(newLastModified, lastModified, "Content Object profile.modified date has changed.");
//Resave object and change profile modified date
contentObject = contentService.save(contentObject, false, true, null);
newLastModified = ((CalendarProperty)contentObject.getCmsProperty("profile.modified")).getSimpleTypeValue();
Assert.assertFalse(newLastModified.equals(lastModified), "Content Object profile.modified date has not changed.");
//Save new content object with flag set to false
contentObject = createContentObject(systemUser, "testLastModifiedChange2");
contentObject = contentService.save(contentObject, false, false, null);
markObjectForRemoval(contentObject);
//Last modified must exist in newly created object
CalendarProperty newLastModifiedProperty = ((CalendarProperty)contentObject.getCmsProperty("profile.modified"));
Assert.assertTrue(newLastModifiedProperty != null && newLastModifiedProperty.hasValues(), "Content Object profile.modified date has not been assigned to newly created content object.");
//Provide a profile.modified date which is before current modified date
Calendar newModifiedDate = Calendar.getInstance();
newModifiedDate.setTimeInMillis(newModifiedDate.getTimeInMillis());
newModifiedDate.add(Calendar.YEAR, -1);
((CalendarProperty)contentObject.getCmsProperty("profile.modified")).setSimpleTypeValue(newModifiedDate);
//Save with updateLastModifiedDate flag set to false
try{
contentObject = contentService.save(contentObject, false, false, null);
}
catch(CmsConcurrentModificationException ccme){
Assert.assertTrue(ccme.getMessage().startsWith("Content Object "+contentObject.getId()+"/"+contentObject.getSystemName()+" has been concurrently modified by another user or current user has tried to set a value for profile.modified property."),
"Invalid error message "+ ccme.getMessage());
}
//Save with updateLastModifiedDate flag set to true
try{
contentObject = contentService.save(contentObject, false, true, null);
}
catch(CmsConcurrentModificationException ccme){
Assert.assertTrue(ccme.getMessage().startsWith("Content Object "+contentObject.getId()+"/"+contentObject.getSystemName()+" has been concurrently modified by another user or current user has tried to set a value for profile.modified property."),
"Invalid error message "+ ccme.getMessage());
}
//Provide a profile.modified date which is after current modified date
newModifiedDate.setTimeInMillis(newModifiedDate.getTimeInMillis());
newModifiedDate.add(Calendar.YEAR, 3);
((CalendarProperty)contentObject.getCmsProperty("profile.modified")).setSimpleTypeValue(newModifiedDate);
//Save with updateLastModifiedDate flag set to false
try{
contentObject = contentService.save(contentObject, false, false, null);
}
catch(CmsConcurrentModificationException ccme){
Assert.assertTrue(ccme.getMessage().startsWith("Content Object "+contentObject.getId()+"/"+contentObject.getSystemName()+" has been concurrently modified by another user or current user has tried to set a value for profile.modified property."),
"Invalid error message "+ ccme.getMessage());
}
//Save with updateLastModifiedDate flag set to true
try{
contentObject = contentService.save(contentObject, false, true, null);
}
catch(CmsConcurrentModificationException ccme){
Assert.assertTrue(ccme.getMessage().startsWith("Content Object "+contentObject.getId()+"/"+contentObject.getSystemName()+" has been concurrently modified by another user or current user has tried to set a value for profile.modified property."),
"Invalid error message "+ ccme.getMessage());
}
}
@Test
public void testProjections(){
RepositoryUser systemUser = getSystemUser();
int numberOfObjects = 5;
for (int i=0;i<numberOfObjects;i++){
ContentObject contentObject = createContentObject(systemUser, "testProjections"+i);
((StringProperty)contentObject.getCmsProperty("profile.title")).setSimpleTypeValue("testProjections");
contentObject = contentService.save(contentObject, false, true, null);
markObjectForRemoval(contentObject);
}
ContentObjectCriteria contentObjectCriteria = CmsCriteriaFactory.newContentObjectCriteria();
contentObjectCriteria.addCriterion(CriterionFactory.equals("profile.title","testProjections"));
contentObjectCriteria.addPropertyPathWhoseValueWillBePreLoaded("profile.title");
contentObjectCriteria.addPropertyPathWhoseValueWillBePreLoaded("profile.language");
contentObjectCriteria.addPropertyPathWhoseValueWillBePreLoaded("stringEnum");
contentObjectCriteria.addPropertyPathWhoseValueWillBePreLoaded("comment.comment");
contentObjectCriteria.addPropertyPathWhoseValueWillBePreLoaded("profile.hasPart");
CmsOutcome<ContentObject> outcome = contentService.searchContentObjects(contentObjectCriteria, ResourceRepresentationType.CONTENT_OBJECT_LIST);
Assert.assertEquals(outcome.getCount(), numberOfObjects, "Total count invalid ");
Assert.assertEquals(outcome.getResults().size(), numberOfObjects, "Results rendered count invalid ");
for (ContentObject contentObject : outcome.getResults()){
assertProjectedPathAlreadyLoaded(contentObject, "profile.title");
assertProjectedPathAlreadyLoaded(contentObject, "profile.language");
assertProjectedPathAlreadyLoaded(contentObject, "stringEnum");
assertProjectedPathAlreadyLoaded(contentObject, "profile.hasPart");
assertProjectedPathAlreadyLoaded(contentObject, "comment[0].comment[0]");
assertPathNotLoaded(contentObject, "accessibility");
}
}
private void assertPathNotLoaded(ContentObject contentObject,
String propertyPath) {
Assert.assertFalse(contentObject.getComplexCmsRootProperty().isChildPropertyLoaded(propertyPath),
"Property "+propertyPath + " has been pre-loaded but it should not be");
}
private void assertProjectedPathAlreadyLoaded(
ContentObject contentObject, String propertyPath) {
boolean childPropertyLoaded = contentObject.getComplexCmsRootProperty().isChildPropertyLoaded(propertyPath);
if (! childPropertyLoaded){
contentObject.getCmsProperty(propertyPath);
}
Assert.assertTrue(childPropertyLoaded,
"Property "+propertyPath + " has not been pre-loaded");
}
//@Test
public void testUnmanagedBinaryChannel() throws Exception{
//Create content objects for test
RepositoryUser systemUser = getSystemUser();
ContentObject contentObject = createContentObject(systemUser, "unmanagedImage");
BinaryChannel logoBinaryChannel = loadUnManagedBinaryChannel(logo.getName(), "unmanagedImage");
BinaryChannel logo2BinaryChannel = loadUnManagedBinaryChannel(logo2.getName(), "unmanagedImage");
//Add two binary channels in property image
((BinaryProperty)contentObject.getCmsProperty("unmanagedImage")).addSimpleTypeValue(logoBinaryChannel);
((BinaryProperty)contentObject.getCmsProperty("unmanagedImage")).addSimpleTypeValue(logo2BinaryChannel);
contentObject = contentService.save(contentObject, false, true, null);
markObjectForRemoval(contentObject);
ContentObject contentObjectReloaded = contentService.getContentObject(contentObject.getId(), ResourceRepresentationType.CONTENT_OBJECT_INSTANCE,
FetchLevel.ENTITY, CacheRegion.NONE, null, false);
BinaryProperty unmanagedImageProperty = (BinaryProperty)contentObjectReloaded.getCmsProperty("unmanagedImage");
Assert.assertTrue(unmanagedImageProperty.hasValues(), "No binary channel saved for unmanagedImage property");
Assert.assertTrue(unmanagedImageProperty.getSimpleTypeValues().size()==2, "Should have saved 2 binary channels for unmanagedImage property");
for (BinaryChannel unmanagedImageBinaryChannel : unmanagedImageProperty.getSimpleTypeValues()){
String sourceFilename = unmanagedImageBinaryChannel.getSourceFilename();
Assert.assertTrue(StringUtils.isNotBlank(sourceFilename), " BinaryChannel "+ unmanagedImageBinaryChannel.getName() + " does not have a source file name");
File fileWhoseContentsAreSavedInBinaryChannel = null;
if (sourceFilename.equals(logo.getName())){
fileWhoseContentsAreSavedInBinaryChannel = logo;
}
else if (sourceFilename.equals(logo2.getName())){
fileWhoseContentsAreSavedInBinaryChannel = logo2;
}
else {
throw new Exception("BnaryChannel contains an invalid source file name "+ sourceFilename);
}
String mimeType = new MimetypesFileTypeMap().getContentType(fileWhoseContentsAreSavedInBinaryChannel);
Assert.assertEquals(unmanagedImageBinaryChannel.getName(), "unmanagedImage");
Assert.assertEquals(unmanagedImageBinaryChannel.getMimeType(), mimeType);
Assert.assertEquals(unmanagedImageBinaryChannel.getSourceFilename(), sourceFilename);
Assert.assertEquals(unmanagedImageBinaryChannel.getSize(), fileWhoseContentsAreSavedInBinaryChannel.length());
Assert.assertEquals(unmanagedImageBinaryChannel.getModified().getTimeInMillis(), fileWhoseContentsAreSavedInBinaryChannel.lastModified());
//Now test in jcr to see if the proper node is created
//Unmanaged Binary property do not have an ID as they represent a jcr property
Node contentObjectNode = getSession().getNodeByIdentifier(contentObjectReloaded.getId());
Property unmanagedImageJcrProperty = contentObjectNode.getProperty("unmanagedImage");
//This property is multivalue and should contain
Value[] relativePaths = unmanagedImageJcrProperty.getValues();
Assert.assertEquals(relativePaths.length, 2, " Jcr property "+unmanagedImageJcrProperty.getPath() + " does not contain 2 values");
boolean foundPath = true;
for (Value relativePath : relativePaths){
if (relativePath.getString().equals(fileWhoseContentsAreSavedInBinaryChannel.getName())){
foundPath = true;
break;
}
}
Assert.assertTrue(foundPath, "Relative Path for unmanaged image "+fileWhoseContentsAreSavedInBinaryChannel.getName() + " was not saved");
}
}
@Test
public void testManagedBinaryChannel() throws Exception{
//Create content objects for test
RepositoryUser systemUser = getSystemUser();
ContentObject contentObject = createContentObject(systemUser, "image");
BinaryChannel logoBinaryChannel = loadManagedBinaryChannel(logo, "image");
BinaryChannel logo2BinaryChannel = loadManagedBinaryChannel(logo2, "image");
//Add two binary channels in property image
((BinaryProperty)contentObject.getCmsProperty("image")).addSimpleTypeValue(logoBinaryChannel);
((BinaryProperty)contentObject.getCmsProperty("image")).addSimpleTypeValue(logo2BinaryChannel);
contentObject = contentService.save(contentObject, false, true, null);
markObjectForRemoval(contentObject);
ContentObject contentObjectReloaded = contentService.getContentObject(contentObject.getId(), ResourceRepresentationType.CONTENT_OBJECT_INSTANCE,
FetchLevel.ENTITY, CacheRegion.NONE, null, false);
BinaryProperty imageProperty = (BinaryProperty)contentObjectReloaded.getCmsProperty("image");
Assert.assertTrue(imageProperty.hasValues(), "No binary channel saved for image property");
Assert.assertTrue(imageProperty.getSimpleTypeValues().size()==2, "Should have saved 2 binary channels for image property");
for (BinaryChannel imageBinaryChannel : imageProperty.getSimpleTypeValues()){
String sourceFilename = imageBinaryChannel.getSourceFilename();
Assert.assertTrue(StringUtils.isNotBlank(sourceFilename), " BinaryChannel "+ imageBinaryChannel.getName() + " does not have a source file name");
File fileWhoseContentsAreSavedInBinaryChannel = null;
if (sourceFilename.equals(logo.getName())){
fileWhoseContentsAreSavedInBinaryChannel = logo;
}
else if (sourceFilename.equals(logo2.getName())){
fileWhoseContentsAreSavedInBinaryChannel = logo2;
}
else {
throw new Exception("BnaryChannel contains an invalid source file name "+ sourceFilename);
}
String mimeType = new MimetypesFileTypeMap().getContentType(fileWhoseContentsAreSavedInBinaryChannel);
Assert.assertEquals(imageBinaryChannel.getName(), "image");
Assert.assertEquals(imageBinaryChannel.getMimeType(), mimeType);
Assert.assertEquals(imageBinaryChannel.getSourceFilename(), sourceFilename);
Assert.assertEquals(imageBinaryChannel.getSize(), fileWhoseContentsAreSavedInBinaryChannel.length());
Assert.assertEquals(imageBinaryChannel.getModified().getTimeInMillis(), fileWhoseContentsAreSavedInBinaryChannel.lastModified());
//Now test in jcr to see if the proper node is created
Node binaryChannelNode = getSession().getNodeByIdentifier(imageBinaryChannel.getId());
//If node is not found then exception has already been thrown
Assert.assertEquals(binaryChannelNode.getName(), imageBinaryChannel.getName(), " Invalid name for binary data jcr node "+ binaryChannelNode.getPath());
Assert.assertEquals(binaryChannelNode.getProperty(CmsBuiltInItem.Name.getJcrName()).getString(), "image");
Assert.assertEquals(binaryChannelNode.getProperty(JcrBuiltInItem.JcrMimeType.getJcrName()).getString(), mimeType);
Assert.assertEquals(binaryChannelNode.getProperty(CmsBuiltInItem.SourceFileName.getJcrName()).getString(), sourceFilename);
Assert.assertEquals(binaryChannelNode.getProperty(CmsBuiltInItem.Size.getJcrName()).getLong(), fileWhoseContentsAreSavedInBinaryChannel.length());
Assert.assertEquals(binaryChannelNode.getProperty(JcrBuiltInItem.JcrLastModified.getJcrName()).getDate().getTimeInMillis(), fileWhoseContentsAreSavedInBinaryChannel.lastModified());
}
}
@Test
public void testSaveCreationDate() throws ItemNotFoundException, RepositoryException{
//Create content objects for test
RepositoryUser systemUser = getSystemUser();
ContentObject contentObject = createContentObject(systemUser, "testSaveCreationDate");
contentObject = contentService.save(contentObject, false, true, null);
markObjectForRemoval(contentObject);
//Retrieve content object node
Node contentObjectNode = getSession().getNodeByIdentifier(contentObject.getId());
Calendar creationDate = ((CalendarProperty)contentObject.getCmsProperty("profile.created")).getSimpleTypeValue();
String creationDatePath = DateFormatUtils.format(creationDate, "yyyy/M/d/H/m/s");
Assert.assertTrue(contentObjectNode.getParent().getPath().endsWith(creationDatePath), "Invalid content object creation path "+contentObjectNode.getParent().getPath()+ ". It should end with "+ creationDatePath);
}
@Test
public void testSaveWithProvidedCreationDate() throws ItemNotFoundException, RepositoryException{
//Create content objects for test
RepositoryUser systemUser = getSystemUser();
ContentObject contentObject = createContentObject(systemUser, "testSaveWithProvidedCreationDate");
Calendar userCreationDate = Calendar.getInstance();
userCreationDate.add(Calendar.YEAR, 1);
((CalendarProperty)contentObject.getCmsProperty("profile.created")).setSimpleTypeValue(userCreationDate);
contentObject = contentService.save(contentObject, false, true, null);
markObjectForRemoval(contentObject);
contentObject = contentService.getContentObject(contentObject.getId(), ResourceRepresentationType.CONTENT_OBJECT_INSTANCE, FetchLevel.ENTITY, CacheRegion.NONE,
null, false);
//Retrieve content object node
Node contentObjectNode = getSession().getNodeByIdentifier(contentObject.getId());
Calendar creationDate = ((CalendarProperty)contentObject.getCmsProperty("profile.created")).getSimpleTypeValue();
Assert.assertEquals(userCreationDate.getTimeInMillis(), creationDate.getTimeInMillis(),
"Invalid creation date. User provided "+DateFormatUtils.format(userCreationDate, "dd/MM/yyy HH:mm:ss")+ " "+userCreationDate.getTimeInMillis()+
" Persisted value "+DateFormatUtils.format(creationDate, "dd/MM/yyy HH:mm:ss")+ " "+creationDate.getTimeInMillis());
String creationDatePath = DateFormatUtils.format(creationDate, "yyyy/M/d/H/m/s");
Assert.assertTrue(contentObjectNode.getParent().getPath().endsWith(creationDatePath), "Invalid content object creation path "+contentObjectNode.getParent().getPath()+ ". It should end with "+ creationDatePath);
}
@Test
public void testUpdateCreationDate() throws ItemNotFoundException, RepositoryException{
//Create content objects for test
RepositoryUser systemUser = getSystemUser();
ContentObject contentObject = createContentObject(systemUser, "testUpdateCreationDate");
contentObject = contentService.save(contentObject, false, true, null);
markObjectForRemoval(contentObject);
//reload content object
contentObject = contentService.getContentObject(contentObject.getId(), ResourceRepresentationType.CONTENT_OBJECT_INSTANCE, FetchLevel.ENTITY, CacheRegion.NONE,
null, false);
Calendar validCreationDate = ((CalendarProperty)contentObject.getCmsProperty("profile.created")).getSimpleTypeValue();
Calendar userCreationDate = Calendar.getInstance();
userCreationDate.add(Calendar.YEAR, 1);
((CalendarProperty)contentObject.getCmsProperty("profile.created")).setSimpleTypeValue(userCreationDate);
TestLogPolicy.setLevelForLogger(Level.FATAL, PopulateSimpleCmsProperty.class.getName());
contentObject = contentService.save(contentObject, false, true, null);
TestLogPolicy.setDefaultLevelForLogger(PopulateSimpleCmsProperty.class.getName());
//reload content object
contentObject = contentService.getContentObject(contentObject.getId(), ResourceRepresentationType.CONTENT_OBJECT_INSTANCE, FetchLevel.ENTITY, CacheRegion.NONE,
null, false);
Calendar persistedCreationDate = ((CalendarProperty)contentObject.getCmsProperty("profile.created")).getSimpleTypeValue();
Assert.assertEquals(validCreationDate.getTimeInMillis(), persistedCreationDate.getTimeInMillis(),
"Invalid creation date. Found "+DateFormatUtils.format(validCreationDate, "dd/MM/yyy HH:mm:ss")+ " "+validCreationDate.getTimeInMillis()+
" but should have been "+DateFormatUtils.format(persistedCreationDate, "dd/MM/yyy HH:mm:ss")+ " "+persistedCreationDate.getTimeInMillis());
//Retrieve content object node
Node contentObjectNode = getSession().getNodeByIdentifier(contentObject.getId());
String creationDatePath = DateFormatUtils.format(validCreationDate, "yyyy/M/d/H/m/s");
Assert.assertTrue(contentObjectNode.getParent().getPath().endsWith(creationDatePath), "Invalid content object creation path "+contentObjectNode.getParent().getPath()+ ". It should end with "+ creationDatePath);
}
@Test
public void testSaveWithVariousSystemNames(){
//Create content objects for test
RepositoryUser systemUser = getSystemUser();
ContentObject contentObject = createContentObject(systemUser, "validSystemName");
contentObject = contentService.save(contentObject, false, true, null);
markObjectForRemoval(contentObject);
//Now provide invalid system name
checkInvalidSystemNameSave(contentObject, "invalid)SystemName");
checkInvalidSystemNameSave(contentObject, "invalid((SystemName");
checkInvalidSystemNameSave(contentObject, "invalid)SystemNa&me");
checkInvalidSystemNameSave(contentObject, "Inv{a}li[dC]ha! ra?ct^e&rs");
checkInvalidSystemNameSave(contentObject, "Inv{a}li[dC]ha! ra?ct^ers");
checkInvalidSystemNameSave(contentObject, "ςδςδ");
checkInvalidSystemNameSave(contentObject, "invaliδName+");
checkInvalidSystemNameSave(contentObject, "Inv{a}li[dC]ha! ra?ct^e&rs");
checkInvalidSystemNameSave(contentObject, "Ελληνι?κά");
checkInvalidSystemNameSave(contentObject, "Ελλ@#ηνικά");
checkInvalidSystemNameSave(contentObject, "Ελ..λην_ι-κ-ά");
checkInvalidSystemNameSave(contentObject, "{{{{{");
checkValidSystemNameSave(contentObject, "09092");
checkValidSystemNameSave(contentObject, "09sasas");
checkValidSystemNameSave(contentObject, "09_sdds-02");
checkValidSystemNameSave(contentObject, "____");
checkValidSystemNameSave(contentObject, "sdsds");
checkValidSystemNameSave(contentObject, "090..92");
checkValidSystemNameSave(contentObject, "090.92");
checkValidSystemNameSave(contentObject, "090..__--92");
checkValidSystemNameSave(contentObject, "090...92");
checkSystemNameTransformation(contentObject, "+leading dash in system name ","leading-dash-in-system-name");
checkSystemNameTransformation(contentObject, "trailing dash in system name +","trailing-dash-in-system-name");
checkSystemNameTransformation(contentObject, "+ both leading and trailing dash in system name +","both-leading-and-trailing-dash-in-system-name");
checkSystemNameTransformation(contentObject, "My System Name", "My-System-Name");
checkSystemNameTransformation(contentObject, " My System Name is very long", "My-System-Name-is-very-long");
checkSystemNameTransformation(contentObject, "invalid)SystemName","invalid-SystemName");
checkSystemNameTransformation(contentObject, "invali((SystemName","invali-SystemName");
checkSystemNameTransformation(contentObject, "invalid)SystemNa&m","invalid-SystemNa-m");
checkSystemNameTransformation(contentObject, "Inv{a}li[dC]a! ra?ct^e&rs","Inv-a-li-dC-a-ra-ct-e-rs");
checkSystemNameTransformation(contentObject, "In{a}li[dC]ha! ra?ct^ers","In-a-li-dC-ha-ra-ct-ers");
checkSystemNameTransformation(contentObject, "ςδςδ","sdsd");
checkSystemNameTransformation(contentObject, "invaliδName+","invalidName");
checkSystemNameTransformation(contentObject, "Ianv{a}li[dC]! ra?ct^e&rs","Ianv-a-li-dC-ra-ct-e-rs");
checkSystemNameTransformation(contentObject, "Ελληνι?κά","Ellhni-ka");
checkSystemNameTransformation(contentObject, "Ελλ@#ηνικά","Ell-hnika");
checkSystemNameTransformation(contentObject, "Ελ..λην_ι-κ-ά","El..lhn_i-k-a");
checkSystemNameTransformation(contentObject, "09092","09092");
checkSystemNameTransformation(contentObject, "09sasas","09sasas");
checkSystemNameTransformation(contentObject, "09_sdds-02","09_sdds-02");
checkSystemNameTransformation(contentObject, "____","____");
checkSystemNameTransformation(contentObject, "sdsds","sdsds");
checkSystemNameTransformation(contentObject, "090..92","090..92");
checkSystemNameTransformation(contentObject, "090.92","090.92");
checkSystemNameTransformation(contentObject, "090..__--92","090..__-92");
checkSystemNameTransformation(contentObject, "a{{{{{{{{{l","a-l");
checkSystemNameTransformation(contentObject, "È,É,Ê,Ë,Û,Ù,Ï,Î,À,Â,Ô,è,é,ê,ë,û,ù,ï,î,à,â,ô,ç","E-E-E-E-U-U-I-I-A-A-O-e-e-e-e-u-u-i-i-a-a-o-c");
checkSystemNameTransformation(contentObject, "Jeisaveta \"Seka\" Sablić","Jeisaveta-Seka-Sablic");
checkSystemNameTransformation(contentObject, "Zoan Ramilović","Zoan-Ramilovic");
checkSystemNameTransformation(contentObject, "Mustfa Naarević","Mustfa-Naarevic");
checkSystemNameTransformation(contentObject, "Dejan Čkić","Dejan-Ckic");
checkSystemNameTransformation(contentObject, "Voin Cetovic","Voin-Cetovic");
}
/**
* @param contentObject
* @param string
* @param string2
*/
private void checkSystemNameTransformation(ContentObject contentObject,
String systemName, String systemNameAfterSave) {
//transformation is enabled only in newly created objects
contentObject.setId(null);
contentObject.setSystemName(null);
((StringProperty)contentObject.getCmsProperty("profile.title")).setSimpleTypeValue(systemName);
contentObject = contentService.save(contentObject, false, true, null);
Assert.assertEquals(contentObject.getSystemName(), systemNameAfterSave, "System name was not transformed correctly");
markObjectForRemoval(contentObject);
}
@Test
public void testSystemName(){
String expectedSystemName = "titleForSystemName";
ContentObject contentObject = createContentObject(repositoryUserService.getSystemRepositoryUser(), "");
((StringProperty)contentObject.getCmsProperty("profile.title")).setSimpleTypeValue(expectedSystemName);
contentObject = contentService.save(contentObject, false, true, null);
markObjectForRemoval(contentObject);
Assert.assertEquals(contentObject.getSystemName(), expectedSystemName);
//Re-save without any change and without loading profile.title
contentObject = contentService.getContentObject(contentObject.getId(), ResourceRepresentationType.CONTENT_OBJECT_INSTANCE,
FetchLevel.ENTITY, CacheRegion.NONE, null, false);
//Nullify system name to force retrieve systemName name from profile.title
contentObject.setSystemName(null);
contentObject = contentService.save(contentObject, false, true, null);
Assert.assertEquals(contentObject.getSystemName(), expectedSystemName);
//Send an empty system name to force generate system name again
//In this case we do not change the system name and thus we expect to generate the same system name
contentObject.setSystemName("");
contentObject = contentService.save(contentObject, false, true, null);
Assert.assertEquals(contentObject.getSystemName(), expectedSystemName);
//Send an empty system name to force generate system name again. Change system name as well
expectedSystemName = "titleForSystemNameAltered";
contentObject.setSystemName("");
((StringProperty)contentObject.getCmsProperty("profile.title")).setSimpleTypeValue(expectedSystemName);
contentObject = contentService.save(contentObject, false, true, null);
Assert.assertEquals(contentObject.getSystemName(), expectedSystemName);
expectedSystemName = "Changed";
loadAccessibilityProperties(contentObject);
contentObject.setId(null);
contentObject.setSystemName(null);
((StringProperty)contentObject.getCmsProperty("profile.title")).setSimpleTypeValue(expectedSystemName);
contentObject = contentService.save(contentObject, false, true, null);
markObjectForRemoval(contentObject);
Assert.assertEquals(contentObject.getSystemName(), expectedSystemName);
expectedSystemName = "Inv{a}li[dC]ha! ra?ct^e&rs";
loadAccessibilityProperties(contentObject);
contentObject.setId(null);
contentObject.setSystemName(null);
((StringProperty)contentObject.getCmsProperty("profile.title")).setSimpleTypeValue(expectedSystemName);
contentObject = contentService.save(contentObject, false, true, null);
markObjectForRemoval(contentObject);
Assert.assertEquals(contentObject.getSystemName(), "Inv-a-li-dC-ha-ra-ct-e-rs");
expectedSystemName = "Ελληνικά";
loadAccessibilityProperties(contentObject);
contentObject.setId(null);
contentObject.setSystemName(null);
((StringProperty)contentObject.getCmsProperty("profile.title")).setSimpleTypeValue(expectedSystemName);
contentObject = contentService.save(contentObject, false, true, null);
markObjectForRemoval(contentObject);
Assert.assertEquals(contentObject.getSystemName(), "Ellhnika");
//Test system name is unique
assertExceptionIsThrownForNonUniqueSystemName("Inv-a-li-dC-ha-ra-ct-e-rs");
assertExceptionIsThrownForNonUniqueSystemName("inv-a-li-dc-ha-ra-ct-E-rs");
assertExceptionIsThrownForNonUniqueSystemName("EllhnikA");
assertExceptionIsThrownForNonUniqueSystemName("CHANGED");
//Create a content object whose system name contains underscore
ContentObject contentObject2 = createContentObject(repositoryUserService.getSystemRepositoryUser(), "testunder_score");
contentObject2 = contentService.save(contentObject2, false, true, null);
markObjectForRemoval(contentObject2);
expectedSystemName = "testunder";
loadAccessibilityProperties(contentObject);
contentObject.setId(null);
contentObject.setSystemName(null);
((StringProperty)contentObject.getCmsProperty("profile.title")).setSimpleTypeValue(expectedSystemName);
contentObject = contentService.save(contentObject, false, true, null);
markObjectForRemoval(contentObject);
Assert.assertEquals(contentObject.getSystemName(), "testunder");
assertExceptionIsThrownForNonUniqueSystemName("testUNder_SCORE");
assertExceptionIsThrownForNonUniqueSystemName("TeStunDER");
}
private void loadAccessibilityProperties(ContentObject contentObject) {
contentObject.getCmsProperty("accessibility.canBeReadBy");
contentObject.getCmsProperty("accessibility.canBeDeletedBy");
contentObject.getCmsProperty("accessibility.canBeTaggedBy");
contentObject.getCmsProperty("accessibility.canBeUpdatedBy");
contentObject.getCmsProperty("profile.language");
}
private void assertExceptionIsThrownForNonUniqueSystemName(String systemName) {
ContentObject anotherContentObject = createContentObject(repositoryUserService.getSystemRepositoryUser(), systemName);
try{
TestLogPolicy.setLevelForLogger(Level.FATAL, PopulateContentObject.class.getName());
anotherContentObject = contentService.save(anotherContentObject, false, true, null);
//Object was saved. Check if it was saved with the alternative value
String alternativeSystemName = TestUtils.createValidSystemName(((StringProperty)anotherContentObject.getCmsProperty("profile.title")).getSimpleTypeValue()+"-"+anotherContentObject.getId());
Assert.assertEquals(anotherContentObject.getSystemName(), alternativeSystemName, "A new contentObject was saved with existing system name "+systemName);
TestLogPolicy.setDefaultLevelForLogger(PopulateContentObject.class.getName());
markObjectForRemoval(anotherContentObject);
}
catch(Exception e){
//Retrieve the exception cause
Throwable t = e;
while (t != null){
if (t.getCause() == null || t == t.getCause()){
break;
}
else{
t = t.getCause();
}
}
Assert.assertEquals("Another content object exists with system name "+ anotherContentObject.getSystemName(), t.getMessage());
}
}
private void checkInvalidSystemNameSave(ContentObject contentObject,
String systemName) {
try{
contentObject.setSystemName(systemName);
contentObject = contentService.save(contentObject, false, true, null);
Assert.assertEquals(1, 2,
"Content object was saved with invalid system name "+systemName);
}
catch(CmsException e){
String message = e.getMessage();
Throwable t = e;
while (t.getCause() != null){
message = t.getCause().getMessage();
t = t.getCause();
}
Assert.assertEquals(message, "Content Object system name "+systemName+" is not valid. It should match pattern "+CmsConstants.SYSTEM_NAME_REG_EXP,
"Invalid exception "+ e.getMessage());
}
}
private void checkValidSystemNameSave(ContentObject contentObject,
String systemName) {
contentObject.setSystemName(systemName);
contentObject = contentService.save(contentObject, false, true, null);
}
@Test
public void testOffsetAndLimitInSearchCriteria(){
RepositoryUser systemUser = getSystemUser();
for (int i=0;i<10;i++){
ContentObject contentObject = createContentObject(systemUser, "testOffsetAndLmit"+i);
((StringProperty)contentObject.getCmsProperty("profile.contentObjectStatus")).setSimpleTypeValue(ContentObjectStatus.published.toString());
((StringProperty)contentObject.getCmsProperty("profile.title")).setSimpleTypeValue("testOffsetAndLmit");
contentObject = contentService.save(contentObject, false, true, null);
markObjectForRemoval(contentObject);
}
ContentObjectCriteria contentObjectCriteria = CmsCriteriaFactory.newContentObjectCriteria();
contentObjectCriteria.addCriterion(CriterionFactory.equals("profile.title", "testOffsetAndLmit"));
assertTotalCountForOffsetAndLimit(contentObjectCriteria, 0,0,10,0);
assertTotalCountForOffsetAndLimit(contentObjectCriteria, 0,-1,10, 10);
assertTotalCountForOffsetAndLimit(contentObjectCriteria, 3,4,10,4);
assertTotalCountForOffsetAndLimit(contentObjectCriteria, 10,0,10, 0);
assertTotalCountForOffsetAndLimit(contentObjectCriteria, 9,1,10,1);
assertTotalCountForOffsetAndLimit(contentObjectCriteria, 2,5,10,5);
assertTotalCountForOffsetAndLimit(contentObjectCriteria, 4,0,10,0);
}
private void assertTotalCountForOffsetAndLimit(
ContentObjectCriteria contentObjectCriteria, int offset, int limit, int totalCount,
int numberOfResultsRendered) {
contentObjectCriteria.setOffsetAndLimit(offset, limit);
CmsOutcome<ContentObject> outcome = contentService.searchContentObjects(contentObjectCriteria, ResourceRepresentationType.CONTENT_OBJECT_LIST);
Assert.assertEquals(outcome.getCount(), totalCount, "Total count invalid for offset "+offset + " and limit "+ limit);
Assert.assertEquals(outcome.getResults().size(), numberOfResultsRendered, "Results rendered" +
" count invalid for offset "+offset + " and limit "+ limit);
}
@Test
public void testEmptyStringPropertyIsNotSaved() throws Exception{
//Create content objects for test
RepositoryUser systemUser = getSystemUser();
ContentObject contentObject = createContentObject(systemUser, TEST_CONTENT_TYPE);
//Provide empty value for string
((StringProperty)contentObject.getCmsProperty("simpleString")).setSimpleTypeValue("");
contentObject = contentService.save(contentObject, false, true, null);
markObjectForRemoval(contentObject);
Node contentObjectNode = getSession().getNodeByIdentifier(contentObject.getId());
Assert.assertFalse(contentObjectNode.hasProperty("simpleString"), "Property simpleString has been saved to JCr even though it is an empty string");
((StringProperty)contentObject.getCmsProperty("simpleStringMultiple")).addSimpleTypeValue("");
((StringProperty)contentObject.getCmsProperty("simpleStringMultiple")).addSimpleTypeValue(" ");
((StringProperty)contentObject.getCmsProperty("simpleStringMultiple")).addSimpleTypeValue(" ");
((StringProperty)contentObject.getCmsProperty("simpleStringMultiple")).addSimpleTypeValue(null);
contentObject = contentService.save(contentObject, false, true, null);
contentObjectNode = getSession().getNodeByIdentifier(contentObject.getId());
Assert.assertFalse(contentObjectNode.hasProperty("simpleStringMultiple"), "Property simpleStringMultiple " +
"has been saved to JCr even though its values is a list of blank strings");
}
@Test
public void testTopicSearchUsingCriteria(){
RepositoryUser systemUser = getSystemUser();
final String taxonomyName = "newTaxonomyForTopicPropertyCriterionTest";
Taxonomy newTaxonomy = JAXBTestUtils.createTaxonomy(taxonomyName,
cmsRepositoryEntityFactory.newTaxonomy());
newTaxonomy = taxonomyService.save(newTaxonomy);
markTaxonomyForRemoval(newTaxonomy);
Topic topic = JAXBTestUtils.createTopic("firstTopic",
CmsRepositoryEntityFactoryForActiveClient.INSTANCE.getFactory().newTopic(),systemUser);
Topic childTopic1 = JAXBTestUtils.createTopic("firstChildOfFirstTopic",
CmsRepositoryEntityFactoryForActiveClient.INSTANCE.getFactory().newTopic(),systemUser);
topic.addChild(childTopic1);
topic.setTaxonomy(newTaxonomy);
topic = topicService.save(topic);
Topic secondTopic = JAXBTestUtils.createTopic("secondTopic",
CmsRepositoryEntityFactoryForActiveClient.INSTANCE.getFactory().newTopic(),systemUser);
Topic childSecondTopic = JAXBTestUtils.createTopic("firstChildOfSecondTopic",
CmsRepositoryEntityFactoryForActiveClient.INSTANCE.getFactory().newTopic(),systemUser);
secondTopic.addChild(childSecondTopic);
secondTopic.setTaxonomy(taxonomyService.getBuiltInSubjectTaxonomy("en"));
secondTopic = topicService.save(secondTopic);
markTopicForRemoval(secondTopic);
ContentObject contentObject = createContentObject(systemUser, "testTopicPropertyCriterion");
((TopicReferenceProperty)contentObject.getCmsProperty("testTopic")).addSimpleTypeValue(topic);
((TopicReferenceProperty)contentObject.getCmsProperty("simpleTopic")).setSimpleTypeValue(childTopic1);
((TopicReferenceProperty)contentObject.getCmsProperty("profile.subject")).addSimpleTypeValue(secondTopic);
contentObject = contentService.save(contentObject, false, true, null);
markObjectForRemoval(contentObject);
String systemName = contentObject.getSystemName();
ContentObjectCriteria contentObjectCriteria = CmsCriteriaFactory.newContentObjectCriteria(TEST_CONTENT_TYPE);
contentObjectCriteria.addCriterion(CriterionFactory.newTopicReferenceCriterion("testTopic", topic.getId(), QueryOperator.EQUALS, false));
assertResult(contentObjectCriteria, 1,systemName);
contentObjectCriteria.addCriterion(CriterionFactory.newTopicReferenceCriterion("simpleTopic", topic.getId(), QueryOperator.EQUALS, true));
assertResult(contentObjectCriteria, 1, systemName);
contentObjectCriteria.reset();
contentObjectCriteria.addCriterion(CriterionFactory.equals("testTopic", topic.getId()));
assertResult(contentObjectCriteria, 1,systemName);
contentObjectCriteria.reset();
contentObjectCriteria.addCriterion(CriterionFactory.equals("simpleTopic", childTopic1.getId()));
assertResult(contentObjectCriteria, 1,systemName);
contentObjectCriteria.reset();
contentObjectCriteria.addCriterion(CriterionFactory.equals("profile.subject", secondTopic.getId()));
assertResult(contentObjectCriteria, 1,systemName);
contentObjectCriteria.reset();
contentObjectCriteria.addCriterion(CriterionFactory.newTopicReferenceCriterion(null, secondTopic.getId(), QueryOperator.EQUALS, true));
assertResult(contentObjectCriteria, 1,systemName);
contentObjectCriteria.reset();
contentObjectCriteria.addProfileSubjectIdCriterion(QueryOperator.EQUALS, secondTopic.getId(), true);
assertResult(contentObjectCriteria, 1,systemName);
}
@Test
public void testSearchWithTopicReferenceCriterion(){
//Create content
RepositoryUser systemUser = getSystemUser();
final String taxonomyName = "newTaxonomyForTopicJoinCriterionTest";
Taxonomy newTaxonomy = JAXBTestUtils.createTaxonomy(taxonomyName,cmsRepositoryEntityFactory.newTaxonomy());
newTaxonomy = taxonomyService.save(newTaxonomy);
markTaxonomyForRemoval(newTaxonomy);
Topic topic = JAXBTestUtils.createTopic("firstJoinTopic",
CmsRepositoryEntityFactoryForActiveClient.INSTANCE.getFactory().newTopic(),systemUser);
Topic childTopic1 = JAXBTestUtils.createTopic("firstChildOfFirstJoinTopic",
CmsRepositoryEntityFactoryForActiveClient.INSTANCE.getFactory().newTopic(),systemUser);
topic.addChild(childTopic1);
topic.setTaxonomy(newTaxonomy);
topic = topicService.save(topic);
Topic secondTopic = JAXBTestUtils.createTopic("secondJoinTopic",
CmsRepositoryEntityFactoryForActiveClient.INSTANCE.getFactory().newTopic(),systemUser);
Topic childSecondTopic = JAXBTestUtils.createTopic("firstChildOfSecondJoinTopic",
CmsRepositoryEntityFactoryForActiveClient.INSTANCE.getFactory().newTopic(),systemUser);
secondTopic.addChild(childSecondTopic);
secondTopic.setTaxonomy(taxonomyService.getBuiltInSubjectTaxonomy("en"));
secondTopic = topicService.save(secondTopic);
markTopicForRemoval(secondTopic);
ContentObject contentObject = createContentObject(systemUser, "testTopicJoinCriterion");
((TopicReferenceProperty)contentObject.getCmsProperty("testTopic")).addSimpleTypeValue(topic);
((TopicReferenceProperty)contentObject.getCmsProperty("simpleTopic")).setSimpleTypeValue(childTopic1);
((TopicReferenceProperty)contentObject.getCmsProperty("profile.subject")).addSimpleTypeValue(childSecondTopic);
((TopicReferenceProperty)contentObject.getCmsProperty("profile.subject")).addSimpleTypeValue(childTopic1);
contentObject = contentService.save(contentObject, false, true, null);
markObjectForRemoval(contentObject);
String systemName = contentObject.getSystemName();
//Assert search by using topic names instead of id and
//by using both TopicPropertyCriterion and simple criterion
ContentObjectCriteria contentObjectCriteria = CmsCriteriaFactory.newContentObjectCriteria(TEST_CONTENT_TYPE);
createAllPossibleTopicReferenceCriterionForTopicAndAssertResult(contentObjectCriteria, "testTopic",topic,systemName, false);
createAllPossibleTopicReferenceCriterionForTopicAndAssertResult(contentObjectCriteria, "simpleTopic",topic,systemName, true);
createAllPossibleTopicReferenceCriterionForTopicAndAssertResult(contentObjectCriteria, "simpleTopic",childTopic1,systemName, false);
createAllPossibleTopicReferenceCriterionForTopicAndAssertResult(contentObjectCriteria, "simpleTopic",childTopic1,systemName, true);
createAllPossibleTopicReferenceCriterionForTopicAndAssertResult(contentObjectCriteria, "profile.subject",secondTopic,systemName, true);
createAllPossibleTopicReferenceCriterionForTopicAndAssertResult(contentObjectCriteria, "profile.subject",childSecondTopic,systemName, false);
createAllPossibleTopicReferenceCriterionForTopicAndAssertResult(contentObjectCriteria, "profile.subject",childSecondTopic,systemName, true);
createAllPossibleTopicReferenceCriterionForTopicAndAssertResult(contentObjectCriteria, "profile.subject",topic,systemName, true);
createAllPossibleTopicReferenceCriterionForTopicAndAssertResult(contentObjectCriteria, "profile.subject",childTopic1,systemName, false);
createAllPossibleTopicReferenceCriterionForTopicAndAssertResult(contentObjectCriteria, "profile.subject",childTopic1,systemName, true);
contentObjectCriteria.reset();
contentObjectCriteria.addCriterion(CriterionFactory.equals("profile.subject", CmsConstants.TOPIC_REFERENCE_CRITERION_VALUE_PREFIX+childTopic1.getName()));
contentObjectCriteria.addCriterion(CriterionFactory.equals("simpleTopic", CmsConstants.TOPIC_REFERENCE_CRITERION_VALUE_PREFIX+childTopic1.getName()));
contentObjectCriteria.addCriterion(CriterionFactory.equals("testTopic", CmsConstants.TOPIC_REFERENCE_CRITERION_VALUE_PREFIX+topic.getName()));
assertResult(contentObjectCriteria, 1,systemName);
contentObjectCriteria.reset();
contentObjectCriteria.addCriterion(CriterionFactory.newTopicReferenceCriterion("testTopic", topic.getName(), QueryOperator.EQUALS, false));
contentObjectCriteria.addCriterion(CriterionFactory.newTopicReferenceCriterion("simpleTopic", childTopic1.getName(), QueryOperator.EQUALS, false));
contentObjectCriteria.addCriterion(CriterionFactory.newTopicReferenceCriterion("profile.subject", childTopic1.getName(), QueryOperator.EQUALS, false));
assertResult(contentObjectCriteria, 1, systemName);
contentObjectCriteria.reset();
contentObjectCriteria.addCriterion(CriterionFactory.newTopicReferenceCriterion("testTopic", topic.getId(), QueryOperator.EQUALS, false));
contentObjectCriteria.addCriterion(CriterionFactory.newTopicReferenceCriterion("simpleTopic", childTopic1.getId(), QueryOperator.EQUALS, false));
contentObjectCriteria.addCriterion(CriterionFactory.newTopicReferenceCriterion("profile.subject", childTopic1.getId(), QueryOperator.EQUALS, false));
assertResult(contentObjectCriteria, 1, systemName);
contentObjectCriteria.reset();
contentObjectCriteria.addCriterion(CriterionFactory.newTopicReferenceCriterion("testTopic", topic, QueryOperator.EQUALS, false));
contentObjectCriteria.addCriterion(CriterionFactory.newTopicReferenceCriterion("simpleTopic", childTopic1, QueryOperator.EQUALS, false));
contentObjectCriteria.addCriterion(CriterionFactory.newTopicReferenceCriterion("profile.subject", childTopic1, QueryOperator.EQUALS, false));
assertResult(contentObjectCriteria, 1, systemName);
}
private void createAllPossibleTopicReferenceCriterionForTopicAndAssertResult(ContentObjectCriteria contentObjectCriteria,
String propertyPath, Topic topic, String contentObjectSystemName, boolean includeSubTopics){
contentObjectCriteria.reset();
contentObjectCriteria.addCriterion(CriterionFactory.newTopicReferenceCriterion(propertyPath, topic.getName(), QueryOperator.EQUALS, includeSubTopics));
assertResult(contentObjectCriteria, 1, contentObjectSystemName);
contentObjectCriteria.reset();
contentObjectCriteria.addCriterion(CriterionFactory.newTopicReferenceCriterion(propertyPath, topic.getName()+CmsConstants.INCLUDE_CHILDREN_EXPRESSION, QueryOperator.EQUALS, includeSubTopics));
assertResult(contentObjectCriteria, 1, contentObjectSystemName);
contentObjectCriteria.reset();
contentObjectCriteria.addCriterion(CriterionFactory.newTopicReferenceCriterion(propertyPath, topic.getName()+CmsConstants.INCLUDE_CHILDREN_EXPRESSION, QueryOperator.EQUALS, !includeSubTopics));
assertResult(contentObjectCriteria, 1, contentObjectSystemName);
contentObjectCriteria.reset();
contentObjectCriteria.addCriterion(CriterionFactory.newTopicReferenceCriterion(null, topic.getName(), QueryOperator.EQUALS, includeSubTopics));
assertResult(contentObjectCriteria, 1, contentObjectSystemName);
contentObjectCriteria.reset();
contentObjectCriteria.addCriterion(CriterionFactory.newTopicReferenceCriterion(null, topic.getName()+CmsConstants.INCLUDE_CHILDREN_EXPRESSION, QueryOperator.EQUALS, includeSubTopics));
assertResult(contentObjectCriteria, 1, contentObjectSystemName);
contentObjectCriteria.reset();
contentObjectCriteria.addCriterion(CriterionFactory.newTopicReferenceCriterion(null, topic.getName()+CmsConstants.INCLUDE_CHILDREN_EXPRESSION, QueryOperator.EQUALS, !includeSubTopics));
assertResult(contentObjectCriteria, 1, contentObjectSystemName);
contentObjectCriteria.reset();
contentObjectCriteria.addCriterion(CriterionFactory.newTopicReferenceCriterion(propertyPath, topic.getId(), QueryOperator.EQUALS, includeSubTopics));
assertResult(contentObjectCriteria, 1, contentObjectSystemName);
contentObjectCriteria.reset();
contentObjectCriteria.addCriterion(CriterionFactory.newTopicReferenceCriterion(propertyPath, topic.getId()+CmsConstants.INCLUDE_CHILDREN_EXPRESSION, QueryOperator.EQUALS, includeSubTopics));
assertResult(contentObjectCriteria, 1, contentObjectSystemName);
contentObjectCriteria.reset();
contentObjectCriteria.addCriterion(CriterionFactory.newTopicReferenceCriterion(propertyPath, topic.getId()+CmsConstants.INCLUDE_CHILDREN_EXPRESSION, QueryOperator.EQUALS, !includeSubTopics));
assertResult(contentObjectCriteria, 1, contentObjectSystemName);
contentObjectCriteria.reset();
contentObjectCriteria.addCriterion(CriterionFactory.newTopicReferenceCriterion(null, topic.getId(), QueryOperator.EQUALS, includeSubTopics));
assertResult(contentObjectCriteria, 1, contentObjectSystemName);
contentObjectCriteria.reset();
contentObjectCriteria.addCriterion(CriterionFactory.newTopicReferenceCriterion(null, topic.getId()+CmsConstants.INCLUDE_CHILDREN_EXPRESSION, QueryOperator.EQUALS, includeSubTopics));
assertResult(contentObjectCriteria, 1, contentObjectSystemName);
contentObjectCriteria.reset();
contentObjectCriteria.addCriterion(CriterionFactory.newTopicReferenceCriterion(null, topic.getId()+CmsConstants.INCLUDE_CHILDREN_EXPRESSION, QueryOperator.EQUALS, !includeSubTopics));
assertResult(contentObjectCriteria, 1, contentObjectSystemName);
contentObjectCriteria.reset();
contentObjectCriteria.addCriterion(CriterionFactory.newTopicReferenceCriterion(propertyPath, topic, QueryOperator.EQUALS, includeSubTopics));
assertResult(contentObjectCriteria, 1, contentObjectSystemName);
contentObjectCriteria.reset();
contentObjectCriteria.addCriterion(CriterionFactory.newTopicReferenceCriterion(null, topic, QueryOperator.EQUALS, includeSubTopics));
assertResult(contentObjectCriteria, 1, contentObjectSystemName);
List topics = new ArrayList();
contentObjectCriteria.reset();
topics.add(topic);
contentObjectCriteria.addCriterion(CriterionFactory.newTopicReferenceCriterion(propertyPath, topics, Condition.OR, QueryOperator.EQUALS, includeSubTopics));
assertResult(contentObjectCriteria, 1, contentObjectSystemName);
contentObjectCriteria.reset();
topics.clear();
topics.add(topic);
contentObjectCriteria.addCriterion(CriterionFactory.newTopicReferenceCriterion(propertyPath, topics, Condition.AND, QueryOperator.EQUALS, includeSubTopics));
assertResult(contentObjectCriteria, 1, contentObjectSystemName);
contentObjectCriteria.reset();
topics.clear();
topics.add(topic);
contentObjectCriteria.addCriterion(CriterionFactory.newTopicReferenceCriterion(null, topics, Condition.AND, QueryOperator.EQUALS, includeSubTopics));
assertResult(contentObjectCriteria, 0, contentObjectSystemName);
contentObjectCriteria.reset();
topics.clear();
topics.add(topic);
contentObjectCriteria.addCriterion(CriterionFactory.newTopicReferenceCriterion(null, topics, Condition.OR, QueryOperator.EQUALS, includeSubTopics));
assertResult(contentObjectCriteria, 1, contentObjectSystemName);
contentObjectCriteria.reset();
topics.clear();
topics.add(topic.getId());
contentObjectCriteria.addCriterion(CriterionFactory.newTopicReferenceCriterion(propertyPath, topics, Condition.AND, QueryOperator.EQUALS, includeSubTopics));
assertResult(contentObjectCriteria, 1, contentObjectSystemName);
contentObjectCriteria.reset();
topics.clear();
topics.add(topic.getId());
contentObjectCriteria.addCriterion(CriterionFactory.newTopicReferenceCriterion(propertyPath, topics, Condition.OR, QueryOperator.EQUALS, includeSubTopics));
assertResult(contentObjectCriteria, 1, contentObjectSystemName);
contentObjectCriteria.reset();
topics.clear();
topics.add(topic.getId());
contentObjectCriteria.addCriterion(CriterionFactory.newTopicReferenceCriterion(null, topics, Condition.AND, QueryOperator.EQUALS, includeSubTopics));
assertResult(contentObjectCriteria, 0, contentObjectSystemName);
contentObjectCriteria.reset();
topics.clear();
topics.add(topic.getId());
contentObjectCriteria.addCriterion(CriterionFactory.newTopicReferenceCriterion(null, topics, Condition.OR, QueryOperator.EQUALS, includeSubTopics));
assertResult(contentObjectCriteria, 1, contentObjectSystemName);
contentObjectCriteria.reset();
topics.clear();
topics.add(topic.getName());
contentObjectCriteria.addCriterion(CriterionFactory.newTopicReferenceCriterion(propertyPath, topics, Condition.AND, QueryOperator.EQUALS, includeSubTopics));
assertResult(contentObjectCriteria, 1, contentObjectSystemName);
contentObjectCriteria.reset();
topics.clear();
topics.add(topic.getName());
contentObjectCriteria.addCriterion(CriterionFactory.newTopicReferenceCriterion(propertyPath, topics, Condition.OR, QueryOperator.EQUALS, includeSubTopics));
assertResult(contentObjectCriteria, 1, contentObjectSystemName);
contentObjectCriteria.reset();
topics.clear();
topics.add(topic.getName());
contentObjectCriteria.addCriterion(CriterionFactory.newTopicReferenceCriterion(null, topics, Condition.OR, QueryOperator.EQUALS, includeSubTopics));
assertResult(contentObjectCriteria, 1, contentObjectSystemName);
contentObjectCriteria.reset();
topics.clear();
topics.add(topic.getName());
contentObjectCriteria.addCriterion(CriterionFactory.newTopicReferenceCriterion(null, topics, Condition.AND, QueryOperator.EQUALS, includeSubTopics));
assertResult(contentObjectCriteria, 0, contentObjectSystemName);
contentObjectCriteria.reset();
contentObjectCriteria.addCriterion(CriterionFactory.equals(propertyPath, CmsConstants.TOPIC_REFERENCE_CRITERION_VALUE_PREFIX+topic.getName()+CmsConstants.INCLUDE_CHILDREN_EXPRESSION));
assertResult(contentObjectCriteria, 1,contentObjectSystemName);
contentObjectCriteria.reset();
contentObjectCriteria.addCriterion(CriterionFactory.equals(propertyPath, topic.getId()+CmsConstants.INCLUDE_CHILDREN_EXPRESSION));
assertResult(contentObjectCriteria, 1,contentObjectSystemName);
if (!includeSubTopics){
contentObjectCriteria.reset();
contentObjectCriteria.addCriterion(CriterionFactory.equals(propertyPath, CmsConstants.TOPIC_REFERENCE_CRITERION_VALUE_PREFIX+topic.getName()));
assertResult(contentObjectCriteria, 1,contentObjectSystemName);
contentObjectCriteria.reset();
contentObjectCriteria.addCriterion(CriterionFactory.equals(propertyPath, topic.getId()));
assertResult(contentObjectCriteria, 1,contentObjectSystemName);
}
}
@Test
public void testSearchContentObjectsOrderByChildProperty(){
RepositoryUser systemUser = getSystemUser();
char[] letters = new char[]{'a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t'};
//We deliberately set the same number in various positions
long[] numbers = new long[]{1,2,3,3,5,6,7,8,9,10,10,11,12,12,14,15,16,16,19,20};
List<Integer> indeces = new ArrayList<Integer>();
for (int i=0;i<20;i++){
indeces.add(i);
}
Collections.shuffle(indeces);
//Create content objects
for (Integer i: indeces){
ContentObject contentObject = createContentObject(systemUser, "testSearchContentObjectsOrderByChildProperty"+i);
((StringProperty)contentObject.getCmsProperty("profile.contentObjectStatus")).setSimpleTypeValue(ContentObjectStatus.published.toString());
((StringProperty)contentObject.getCmsProperty("profile.title")).setSimpleTypeValue(letters[i]+"testSearchContentObjectsOrderByChildProperty");
((StringProperty)contentObject.getCmsProperty("simpleString")).setSimpleTypeValue(letters[i]+"testSearchContentObjectsOrderByChildProperty");
((StringProperty)contentObject.getCmsProperty("comment.body")).setSimpleTypeValue(letters[i]+"testSearchContentObjectsOrderByChildProperty");
((StringProperty)contentObject.getCmsProperty("comment.comment.body")).setSimpleTypeValue(letters[i]+"testSearchContentObjectsOrderByChildProperty");
((LongProperty)contentObject.getCmsProperty("allPropertyTypeContainer.simpleLong")).setSimpleTypeValue(numbers[i]);
//Default values will be loaded
contentObject.getCmsProperty("stringEnum");
contentObject.getCmsProperty("longEnum");
contentObject = contentService.save(contentObject, false, true, null);
markObjectForRemoval(contentObject);
}
assertOrderedResultsWithOnlyOneChildProperty(0,20, letters, numbers);
assertOrderedResultsWithOnlyOneChildProperty(0,10, letters, numbers);
assertOrderedResultsWithOnlyOneChildProperty(3,3,letters, numbers);
assertOrderedResultsWithOnlyOneChildProperty(10,20, letters, numbers);
assertOrderedResultsWithOnlyOneChildProperty(19,20, letters, numbers);
assertOrderedResultsWithOnlyOneChildProperty(10,50, letters, numbers);
assertOrderedResultsWithOnlyTwoChildPropertiesInOrderBy(0,20, letters, numbers);
assertOrderedResultsWithOnlyTwoChildPropertiesInOrderBy(0,10, letters, numbers);
assertOrderedResultsWithOnlyTwoChildPropertiesInOrderBy(3,3,letters, numbers);
assertOrderedResultsWithOnlyTwoChildPropertiesInOrderBy(10,20, letters, numbers);
assertOrderedResultsWithOnlyTwoChildPropertiesInOrderBy(19,20, letters, numbers);
assertOrderedResultsWithOnlyTwoChildPropertiesInOrderBy(10,50, letters, numbers);
assertOrderedResultsWithThreeChildPropertiesInOrderBy(0,20, letters, numbers);
assertOrderedResultsWithThreeChildPropertiesInOrderBy(0,10, letters, numbers);
assertOrderedResultsWithThreeChildPropertiesInOrderBy(3,3,letters, numbers);
assertOrderedResultsWithThreeChildPropertiesInOrderBy(10,20, letters, numbers);
assertOrderedResultsWithThreeChildPropertiesInOrderBy(19,20, letters, numbers);
assertOrderedResultsWithThreeChildPropertiesInOrderBy(10,50, letters, numbers);
}
private void assertOrderedResultsWithOnlyOneChildProperty(int offset, int limit, char[] letters, long[] numbers) {
for (Order order : Order.values()){
//Property simpleString
ContentObjectCriteria contentObjectCriteria = createContentObjectCriteriaForSearchUsingOrderByChildProperty(offset, limit, order);
contentObjectCriteria.addOrderProperty("simpleString", order);
long start = System.currentTimeMillis();
CmsOutcome<ContentObject> outcome = contentService.searchContentObjects(contentObjectCriteria, ResourceRepresentationType.CONTENT_OBJECT_LIST);
logger.debug("Search with order by child property simpleString and Offset {} Limit {} Order {}, took {} ms",
new Object[]{offset, limit, order, (System.currentTimeMillis()-start)});
Assert.assertNotNull(outcome, "Method testSearchContentObjectsOrderByChildProperty did not return any outcome in query for offset "+offset +" limit "+limit + " order "+order);
Assert.assertTrue(outcome.getResults()!=null && outcome.getResults().size() > 0, "Method testSearchContentObjectsOrderByChildProperty did not return any results in query for offset "+offset +" limit "+limit + " order "+order);
for (int i=0; i<=outcome.getResults().size()-1; i++){
ContentObject contentObject = outcome.getResults().get(i);
char letter = order == Order.ascending ? letters[offset+i] : letters[letters.length-i-offset-1];
final String simpleString = ((StringProperty)contentObject.getCmsProperty("simpleString")).getSimpleTypeValue();
logger.debug("SimpleString: {}", simpleString );
Assert.assertEquals(simpleString,
letter+"testSearchContentObjectsOrderByChildProperty", "offset "+offset +" limit "+limit + " order "+order + " index "+i + " letter chosen "+ letter);
}
//Property profile.title
contentObjectCriteria = createContentObjectCriteriaForSearchUsingOrderByChildProperty(offset, limit, order);
contentObjectCriteria.addOrderProperty("profile.title", order);
start = System.currentTimeMillis();
outcome = contentService.searchContentObjects(contentObjectCriteria, ResourceRepresentationType.CONTENT_OBJECT_LIST);
logger.debug("Search with order by child property profile.title and Offset {} Limit {} Order {}, took {} ms",
new Object[]{offset, limit, order, (System.currentTimeMillis()-start)});
Assert.assertNotNull(outcome, "Method testSearchContentObjectsOrderByChildProperty did not return any outcome in query for offset "+offset +" limit "+limit + " order "+order);
Assert.assertTrue(outcome.getResults()!=null && outcome.getResults().size() > 0, "Method testSearchContentObjectsOrderByChildProperty did not return any results in query for offset "+offset +" limit "+limit + " order "+order);
for (int i=0; i<=outcome.getResults().size()-1; i++){
ContentObject contentObject = outcome.getResults().get(i);
char letter = order == Order.ascending ? letters[offset+i] : letters[letters.length-i-offset-1];
final String title = ((StringProperty)contentObject.getCmsProperty("profile.title")).getSimpleTypeValue();
logger.debug("Title: {}", title );
Assert.assertEquals(title,
letter+"testSearchContentObjectsOrderByChildProperty", "offset "+offset +" limit "+limit + " order "+order + " index "+i + " letter chosen "+ letter);
}
//Property allPropertyTypeContainer.simpleLong
contentObjectCriteria = createContentObjectCriteriaForSearchUsingOrderByChildProperty(offset, limit, order);
contentObjectCriteria.addOrderProperty("allPropertyTypeContainer.simpleLong", order);
start = System.currentTimeMillis();
outcome = contentService.searchContentObjects(contentObjectCriteria, ResourceRepresentationType.CONTENT_OBJECT_LIST);
logger.debug("Search with order by child property allPropertyTypeContainer.simpleLong and Offset {} Limit {} Order {}, took {} ms",
new Object[]{offset, limit, order, (System.currentTimeMillis()-start)});
Assert.assertNotNull(outcome, "Method testSearchContentObjectsOrderByChildProperty did not return any outcome in query for offset "+offset +" limit "+limit + " order "+order);
Assert.assertTrue(outcome.getResults()!=null && outcome.getResults().size() > 0, "Method testSearchContentObjectsOrderByChildProperty did not return any results in query for offset "+offset +" limit "+limit + " order "+order);
for (int i=0; i<=outcome.getResults().size()-1; i++){
ContentObject contentObject = outcome.getResults().get(i);
long number = order == Order.ascending ? numbers[offset+i] : numbers[numbers.length-i-offset-1];
final long simpleLong = ((LongProperty)contentObject.getCmsProperty("allPropertyTypeContainer.simpleLong")).getSimpleTypeValue();
logger.debug("allPropertyTypeContainer.simpleLong: {}", simpleLong );
Assert.assertEquals(simpleLong,
number, "offset "+offset +" limit "+limit + " order "+order + " index "+i + " number chosen "+ number);
}
//Property comment.comment.body
contentObjectCriteria = createContentObjectCriteriaForSearchUsingOrderByChildProperty(offset, limit, order);
contentObjectCriteria.addOrderProperty("comment.comment.body", order);
start = System.currentTimeMillis();
outcome = contentService.searchContentObjects(contentObjectCriteria, ResourceRepresentationType.CONTENT_OBJECT_LIST);
logger.debug("Search with order by child property comment.comment.body and Offset {} Limit {} Order {}, took {} ms",
new Object[]{offset, limit, order, (System.currentTimeMillis()-start)});
Assert.assertNotNull(outcome, "Method testSearchContentObjectsOrderByChildProperty did not return any outcome in query for offset "+offset +" limit "+limit + " order "+order);
Assert.assertTrue(outcome.getResults()!=null && outcome.getResults().size() > 0, "Method testSearchContentObjectsOrderByChildProperty did not return any results in query for offset "+offset +" limit "+limit + " order "+order);
for (int i=0; i<=outcome.getResults().size()-1; i++){
ContentObject contentObject = outcome.getResults().get(i);
char letter = order == Order.ascending ? letters[offset+i] : letters[letters.length-i-offset-1];
final String comment = ((StringProperty)contentObject.getCmsProperty("comment.comment.body")).getSimpleTypeValue();
logger.debug("comment.comment.body: {}", comment );
Assert.assertEquals(comment,
letter+"testSearchContentObjectsOrderByChildProperty", "offset "+offset +" limit "+limit + " order "+order + " index "+i + " letter chosen "+ letter);
}
}
}
private void assertOrderedResultsWithThreeChildPropertiesInOrderBy(int offset, int limit, char[] letters, long[] numbers) {
for (Order order : Order.values()){
ContentObjectCriteria contentObjectCriteria = createContentObjectCriteriaForSearchUsingOrderByChildProperty(offset, limit, order);
contentObjectCriteria.addOrderProperty("allPropertyTypeContainer.simpleLong", order);
contentObjectCriteria.addOrderProperty("profile.title", order);
contentObjectCriteria.addOrderProperty("comment.comment.body", order);
long start = System.currentTimeMillis();
CmsOutcome<ContentObject> outcome = contentService.searchContentObjects(contentObjectCriteria, ResourceRepresentationType.CONTENT_OBJECT_LIST);
logger.debug("Search with order by child property profile.title and allPropertyTypeContainer.simpleLong and comment.comment.body and Offset {} Limit {} Order {}, took {} ms",
new Object[]{offset, limit, order, (System.currentTimeMillis()-start)});
Assert.assertNotNull(outcome, "Method testSearchContentObjectsOrderByChildProperty did not return any outcome in query for offset "+offset +" limit "+limit + " order "+order);
Assert.assertTrue(outcome.getResults()!=null && outcome.getResults().size() > 0, "Method testSearchContentObjectsOrderByChildProperty did not return any results in query for offset "+offset +" limit "+limit + " order "+order);
for (int i=0; i<=outcome.getResults().size()-1; i++){
ContentObject contentObject = outcome.getResults().get(i);
char letter = order == Order.ascending ? letters[offset+i] : letters[letters.length-i-offset-1];
long number = order == Order.ascending ? numbers[offset+i] : numbers[numbers.length-i-offset-1];
final String title = ((StringProperty)contentObject.getCmsProperty("profile.title")).getSimpleTypeValue();
final long simpleLong = ((LongProperty)contentObject.getCmsProperty("allPropertyTypeContainer.simpleLong")).getSimpleTypeValue().longValue();
final String comment = ((StringProperty)contentObject.getCmsProperty("comment.comment.body")).getSimpleTypeValue();
logger.debug("Number: {}, Title: {}, Comment: {}", new Object[]{ number, title, comment} );
Assert.assertEquals(title,
letter+"testSearchContentObjectsOrderByChildProperty", "offset "+offset +" limit "+limit + " order "+order + " index "+i + " letter chosen "+ letter);
Assert.assertEquals(simpleLong,
number, "offset "+offset +" limit "+limit + " order "+order + " index "+i + " number chosen "+ number);
Assert.assertEquals(comment,
letter+"testSearchContentObjectsOrderByChildProperty", "offset "+offset +" limit "+limit + " order "+order + " index "+i + " letter chosen "+ letter);
}
}
}
private void assertOrderedResultsWithOnlyTwoChildPropertiesInOrderBy(int offset, int limit, char[] letters, long[] numbers) {
for (Order order : Order.values()){
ContentObjectCriteria contentObjectCriteria = createContentObjectCriteriaForSearchUsingOrderByChildProperty(offset, limit, order);
contentObjectCriteria.addOrderProperty("allPropertyTypeContainer.simpleLong", order);
contentObjectCriteria.addOrderProperty("profile.title", order);
long start = System.currentTimeMillis();
CmsOutcome<ContentObject> outcome = contentService.searchContentObjects(contentObjectCriteria, ResourceRepresentationType.CONTENT_OBJECT_LIST);
logger.debug("Search with order by child property profile.title and allPropertyTypeContainer.simpleLong and Offset {} Limit {} Order {}, took {} ms",
new Object[]{offset, limit, order, (System.currentTimeMillis()-start)});
Assert.assertNotNull(outcome, "Method testSearchContentObjectsOrderByChildProperty did not return any outcome in query for offset "+offset +" limit "+limit + " order "+order);
Assert.assertTrue(outcome.getResults()!=null && outcome.getResults().size() > 0, "Method testSearchContentObjectsOrderByChildProperty did not return any results in query for offset "+offset +" limit "+limit + " order "+order);
for (int i=0; i<=outcome.getResults().size()-1; i++){
ContentObject contentObject = outcome.getResults().get(i);
char letter = order == Order.ascending ? letters[offset+i] : letters[letters.length-i-offset-1];
long number = order == Order.ascending ? numbers[offset+i] : numbers[numbers.length-i-offset-1];
final String title = ((StringProperty)contentObject.getCmsProperty("profile.title")).getSimpleTypeValue();
final long simpleLong = ((LongProperty)contentObject.getCmsProperty("allPropertyTypeContainer.simpleLong")).getSimpleTypeValue().longValue();
logger.debug("Number: {}, Title: {}", number, title );
Assert.assertEquals(title,
letter+"testSearchContentObjectsOrderByChildProperty", "offset "+offset +" limit "+limit + " order "+order + " index "+i + " letter chosen "+ letter);
Assert.assertEquals(simpleLong,
number, "offset "+offset +" limit "+limit + " order "+order + " index "+i + " number chosen "+ number);
}
}
}
private ContentObjectCriteria createContentObjectCriteriaForSearchUsingOrderByChildProperty(int offset, int limit, Order order) {
ContentObjectCriteria contentObjectCriteria = CmsCriteriaFactory.newContentObjectCriteria();
contentObjectCriteria.addSystemNameContainsCriterion("testSearchContentObjectsOrderByChildProperty*");
contentObjectCriteria.setOffsetAndLimit(offset, limit);
return contentObjectCriteria;
}
@Test
public void testSearchWithContentObjectReferenceCriterion(){
RepositoryUser systemUser = getSystemUser();
//Create content
ContentObject mainContentObject = createAndPublishSpecificContentObject(systemUser,"testContentObjectJoinInSearchMainContentObject", TEST_CONTENT_TYPE);
ContentObjectCriteria contentObjectCriteria = CmsCriteriaFactory.newContentObjectCriteria(TEST_CONTENT_TYPE);
//Create content object references
createContentObjectReferenceForPropertyAndAssertContentObjectReferenceCriterionInSearch(systemUser, mainContentObject, contentObjectCriteria, "simpleContentObject", "testContentObjectJoinInSearchForSimpleContentObjectPropertyReferenceOfType"+TEST_CONTENT_TYPE, TEST_CONTENT_TYPE);
createContentObjectReferenceForPropertyAndAssertContentObjectReferenceCriterionInSearch(systemUser, mainContentObject, contentObjectCriteria, "simpleContentObject", "testContentObjectJoinInSearchForSimpleContentObjectPropertyReferenceOfType"+EXTENDED_TEST_CONTENT_TYPE, EXTENDED_TEST_CONTENT_TYPE);
createContentObjectReferenceForPropertyAndAssertContentObjectReferenceCriterionInSearch(systemUser, mainContentObject, contentObjectCriteria, "simpleContentObject", "testContentObjectJoinInSearchForSimpleContentObjectPropertyReferenceOfType"+DIRECT_EXTENDED_TEST_CONTENT_TYPE, DIRECT_EXTENDED_TEST_CONTENT_TYPE);
createContentObjectReferenceForPropertyAndAssertContentObjectReferenceCriterionInSearch(systemUser, mainContentObject, contentObjectCriteria, "simpleContentObjectMultiple", "testContentObjectJoinInSearchForSimpleContentObjectMultiplePropertyReferenceOfType"+TEST_CONTENT_TYPE, TEST_CONTENT_TYPE);
createContentObjectReferenceForPropertyAndAssertContentObjectReferenceCriterionInSearch(systemUser, mainContentObject, contentObjectCriteria, "simpleContentObjectMultiple", "testContentObjectJoinInSearchForSimpleContentObjectMultiplePropertyReferenceOfType"+EXTENDED_TEST_CONTENT_TYPE, EXTENDED_TEST_CONTENT_TYPE);
createContentObjectReferenceForPropertyAndAssertContentObjectReferenceCriterionInSearch(systemUser, mainContentObject, contentObjectCriteria, "simpleContentObjectMultiple", "testContentObjectJoinInSearchForSimpleContentObjectMultiplePropertyReferenceOfType"+DIRECT_EXTENDED_TEST_CONTENT_TYPE, DIRECT_EXTENDED_TEST_CONTENT_TYPE);
createContentObjectReferenceForPropertyAndAssertContentObjectReferenceCriterionInSearch(systemUser, mainContentObject, contentObjectCriteria, "referenceOfAnyContentObjectOfTypeTestType", "testContentObjectJoinInSearchForReferenceOfAnyContentObjectOfTypeTestTypePropertyReferenceOfType"+TEST_CONTENT_TYPE, TEST_CONTENT_TYPE);
createContentObjectReferenceForPropertyAndAssertContentObjectReferenceCriterionInSearch(systemUser, mainContentObject, contentObjectCriteria, "referenceOfAnyContentObjectOfTypeTestType", "testContentObjectJoinInSearchForReferenceOfAnyContentObjectOfTypeTestTypePropertyReferenceOfType"+EXTENDED_TEST_CONTENT_TYPE, EXTENDED_TEST_CONTENT_TYPE);
createContentObjectReferenceForPropertyAndAssertContentObjectReferenceCriterionInSearch(systemUser, mainContentObject, contentObjectCriteria, "referenceOfAnyContentObjectOfTypeTestType", "testContentObjectJoinInSearchForReferenceOfAnyContentObjectOfTypeTestTypePropertyReferenceOfType"+DIRECT_EXTENDED_TEST_CONTENT_TYPE, DIRECT_EXTENDED_TEST_CONTENT_TYPE);
createContentObjectReferenceForPropertyAndAssertContentObjectReferenceCriterionInSearch(systemUser, mainContentObject, contentObjectCriteria, "multipleReferenceOfAnyContentObjectOfTypeTestType", "testContentObjectJoinInSearchForMultipleReferenceOfAnyContentObjectOfTypeTestTypePropertyReferenceOfType"+TEST_CONTENT_TYPE, TEST_CONTENT_TYPE);
createContentObjectReferenceForPropertyAndAssertContentObjectReferenceCriterionInSearch(systemUser, mainContentObject, contentObjectCriteria, "multipleReferenceOfAnyContentObjectOfTypeTestType", "testContentObjectJoinInSearchForMultipleReferenceOfAnyContentObjectOfTypeTestTypePropertyReferenceOfType"+EXTENDED_TEST_CONTENT_TYPE, EXTENDED_TEST_CONTENT_TYPE);
createContentObjectReferenceForPropertyAndAssertContentObjectReferenceCriterionInSearch(systemUser, mainContentObject, contentObjectCriteria, "multipleReferenceOfAnyContentObjectOfTypeTestType", "testContentObjectJoinInSearchForMultipleReferenceOfAnyContentObjectOfTypeTestTypePropertyReferenceOfType"+DIRECT_EXTENDED_TEST_CONTENT_TYPE, DIRECT_EXTENDED_TEST_CONTENT_TYPE);
createContentObjectReferenceForPropertyAndAssertContentObjectReferenceCriterionInSearch(systemUser, mainContentObject, contentObjectCriteria, "referenceOfAnyContentObjectOfTypeTest", "testContentObjectJoinInSearchForReferenceOfAnyContentObjectOfTypeTestPropertyReferenceOfType"+TEST_CONTENT_TYPE, TEST_CONTENT_TYPE);
createContentObjectReferenceForPropertyAndAssertContentObjectReferenceCriterionInSearch(systemUser, mainContentObject, contentObjectCriteria, "multipleReferenceOfAnyContentObjectOfTypeTest", "testContentObjectJoinInSearchForMultipleReferenceOfAnyContentObjectOfTypeTestPropertyReferenceOfType"+TEST_CONTENT_TYPE, TEST_CONTENT_TYPE);
createContentObjectReferenceForPropertyAndAssertContentObjectReferenceCriterionInSearch(systemUser, mainContentObject, contentObjectCriteria, "referenceOfAnyContentObjectOfTypeTestAndExtendedTest", "testContentObjectJoinInSearchForReferenceOfAnyContentObjectOfTypeTestAndExtendedTestPropertyReferenceOfType"+TEST_CONTENT_TYPE, TEST_CONTENT_TYPE);
createContentObjectReferenceForPropertyAndAssertContentObjectReferenceCriterionInSearch(systemUser, mainContentObject, contentObjectCriteria, "referenceOfAnyContentObjectOfTypeTestAndExtendedTest", "testContentObjectJoinInSearchForReferenceOfAnyContentObjectOfTypeTestAndExtendedTestPropertyReferenceOfType"+EXTENDED_TEST_CONTENT_TYPE, EXTENDED_TEST_CONTENT_TYPE);
createContentObjectReferenceForPropertyAndAssertContentObjectReferenceCriterionInSearch(systemUser, mainContentObject, contentObjectCriteria, "multipleReferenceOfAnyContentObjectOfTypeTestAndExtendedTest", "testContentObjectJoinInSearchForMultipleReferenceOfAnyContentObjectOfTypeTestAndExtendedTestPropertyReferenceOfType"+TEST_CONTENT_TYPE, TEST_CONTENT_TYPE);
createContentObjectReferenceForPropertyAndAssertContentObjectReferenceCriterionInSearch(systemUser, mainContentObject, contentObjectCriteria, "multipleReferenceOfAnyContentObjectOfTypeTestAndExtendedTest", "testContentObjectJoinInSearchForMultipleReferenceOfAnyContentObjectOfTypeTestAndExtendedTestPropertyReferenceOfType"+EXTENDED_TEST_CONTENT_TYPE, EXTENDED_TEST_CONTENT_TYPE);
createContentObjectReferenceForPropertyAndAssertContentObjectReferenceCriterionInSearch(systemUser, mainContentObject, contentObjectCriteria, "allPropertyTypeContainer.simpleContentObject", "testContentObjectJoinInSearchForAllPropertyTypeContainerSimpleContentObjectPropertyReferenceOfType"+TEST_CONTENT_TYPE, TEST_CONTENT_TYPE);
createContentObjectReferenceForPropertyAndAssertContentObjectReferenceCriterionInSearch(systemUser, mainContentObject, contentObjectCriteria, "allPropertyTypeContainer.simpleContentObject", "testContentObjectJoinInSearchForAllPropertyTypeContainerSimpleContentObjectPropertyReferenceOfType"+EXTENDED_TEST_CONTENT_TYPE, EXTENDED_TEST_CONTENT_TYPE);
createContentObjectReferenceForPropertyAndAssertContentObjectReferenceCriterionInSearch(systemUser, mainContentObject, contentObjectCriteria, "allPropertyTypeContainer.simpleContentObject", "testContentObjectJoinInSearchForAllPropertyTypeContainerSimpleContentObjectPropertyReferenceOfType"+DIRECT_EXTENDED_TEST_CONTENT_TYPE, DIRECT_EXTENDED_TEST_CONTENT_TYPE);
createContentObjectReferenceForPropertyAndAssertContentObjectReferenceCriterionInSearch(systemUser, mainContentObject, contentObjectCriteria, "allPropertyTypeContainer.simpleContentObjectMultiple", "testContentObjectJoinInSearchForAllPropertyTypeContainerSimpleContentObjectMultiplePropertyReferenceOfType"+TEST_CONTENT_TYPE, TEST_CONTENT_TYPE);
createContentObjectReferenceForPropertyAndAssertContentObjectReferenceCriterionInSearch(systemUser, mainContentObject, contentObjectCriteria, "allPropertyTypeContainer.simpleContentObjectMultiple", "testContentObjectJoinInSearchForAllPropertyTypeContainerSimpleContentObjectMultiplePropertyReferenceOfType"+EXTENDED_TEST_CONTENT_TYPE, EXTENDED_TEST_CONTENT_TYPE);
createContentObjectReferenceForPropertyAndAssertContentObjectReferenceCriterionInSearch(systemUser, mainContentObject, contentObjectCriteria, "allPropertyTypeContainer.simpleContentObjectMultiple", "testContentObjectJoinInSearchForAllPropertyTypeContainerSimpleContentObjectMultiplePropertyReferenceOfType"+DIRECT_EXTENDED_TEST_CONTENT_TYPE, DIRECT_EXTENDED_TEST_CONTENT_TYPE);
createContentObjectReferenceForPropertyAndAssertContentObjectReferenceCriterionInSearch(systemUser, mainContentObject, contentObjectCriteria, "allPropertyTypeContainer.referenceOfAnyContentObjectOfTypeTestType", "testContentObjectJoinInSearchForAllPropertyTypeContainerReferenceOfAnyContentObjectOfTypeTestTypePropertyReferenceOfType"+TEST_CONTENT_TYPE, TEST_CONTENT_TYPE);
createContentObjectReferenceForPropertyAndAssertContentObjectReferenceCriterionInSearch(systemUser, mainContentObject, contentObjectCriteria, "allPropertyTypeContainer.referenceOfAnyContentObjectOfTypeTestType", "testContentObjectJoinInSearchForAllPropertyTypeContainerReferenceOfAnyContentObjectOfTypeTestTypePropertyReferenceOfType"+EXTENDED_TEST_CONTENT_TYPE, EXTENDED_TEST_CONTENT_TYPE);
createContentObjectReferenceForPropertyAndAssertContentObjectReferenceCriterionInSearch(systemUser, mainContentObject, contentObjectCriteria, "allPropertyTypeContainer.referenceOfAnyContentObjectOfTypeTestType", "testContentObjectJoinInSearchForAllPropertyTypeContainerReferenceOfAnyContentObjectOfTypeTestTypePropertyReferenceOfType"+DIRECT_EXTENDED_TEST_CONTENT_TYPE, DIRECT_EXTENDED_TEST_CONTENT_TYPE);
createContentObjectReferenceForPropertyAndAssertContentObjectReferenceCriterionInSearch(systemUser, mainContentObject, contentObjectCriteria, "allPropertyTypeContainer.multipleReferenceOfAnyContentObjectOfTypeTestType", "testContentObjectJoinInSearchForAllPropertyTypeContainerMultipleReferenceOfAnyContentObjectOfTypeTestTypePropertyReferenceOfType"+TEST_CONTENT_TYPE, TEST_CONTENT_TYPE);
createContentObjectReferenceForPropertyAndAssertContentObjectReferenceCriterionInSearch(systemUser, mainContentObject, contentObjectCriteria, "allPropertyTypeContainer.multipleReferenceOfAnyContentObjectOfTypeTestType", "testContentObjectJoinInSearchForAllPropertyTypeContainerMultipleReferenceOfAnyContentObjectOfTypeTestTypePropertyReferenceOfType"+EXTENDED_TEST_CONTENT_TYPE, EXTENDED_TEST_CONTENT_TYPE);
createContentObjectReferenceForPropertyAndAssertContentObjectReferenceCriterionInSearch(systemUser, mainContentObject, contentObjectCriteria, "allPropertyTypeContainer.multipleReferenceOfAnyContentObjectOfTypeTestType", "testContentObjectJoinInSearchForAllPropertyTypeContainerMultipleReferenceOfAnyContentObjectOfTypeTestTypePropertyReferenceOfType"+DIRECT_EXTENDED_TEST_CONTENT_TYPE, DIRECT_EXTENDED_TEST_CONTENT_TYPE);
createContentObjectReferenceForPropertyAndAssertContentObjectReferenceCriterionInSearch(systemUser, mainContentObject, contentObjectCriteria, "allPropertyTypeContainer.referenceOfAnyContentObjectOfTypeTest", "testContentObjectJoinInSearchForAllPropertyTypeContainerReferenceOfAnyContentObjectOfTypeTestPropertyReferenceOfType"+TEST_CONTENT_TYPE, TEST_CONTENT_TYPE);
createContentObjectReferenceForPropertyAndAssertContentObjectReferenceCriterionInSearch(systemUser, mainContentObject, contentObjectCriteria, "allPropertyTypeContainer.multipleReferenceOfAnyContentObjectOfTypeTest", "testContentObjectJoinInSearchForAllPropertyTypeContainerMultipleReferenceOfAnyContentObjectOfTypeTestPropertyReferenceOfType"+TEST_CONTENT_TYPE, TEST_CONTENT_TYPE);
createContentObjectReferenceForPropertyAndAssertContentObjectReferenceCriterionInSearch(systemUser, mainContentObject, contentObjectCriteria, "allPropertyTypeContainer.referenceOfAnyContentObjectOfTypeTestAndExtendedTest", "testContentObjectJoinInSearchForAllPropertyTypeContainerReferenceOfAnyContentObjectOfTypeTestAndExtendedTestPropertyReferenceOfType"+TEST_CONTENT_TYPE, TEST_CONTENT_TYPE);
createContentObjectReferenceForPropertyAndAssertContentObjectReferenceCriterionInSearch(systemUser, mainContentObject, contentObjectCriteria, "allPropertyTypeContainer.referenceOfAnyContentObjectOfTypeTestAndExtendedTest", "testContentObjectJoinInSearchForAllPropertyTypeContainerReferenceOfAnyContentObjectOfTypeTestAndExtendedTestPropertyReferenceOfType"+EXTENDED_TEST_CONTENT_TYPE, EXTENDED_TEST_CONTENT_TYPE);
createContentObjectReferenceForPropertyAndAssertContentObjectReferenceCriterionInSearch(systemUser, mainContentObject, contentObjectCriteria, "allPropertyTypeContainer.multipleReferenceOfAnyContentObjectOfTypeTestAndExtendedTest", "testContentObjectJoinInSearchForAllPropertyTypeContainerMultipleReferenceOfAnyContentObjectOfTypeTestAndExtendedTestPropertyReferenceOfType"+TEST_CONTENT_TYPE, TEST_CONTENT_TYPE);
createContentObjectReferenceForPropertyAndAssertContentObjectReferenceCriterionInSearch(systemUser, mainContentObject, contentObjectCriteria, "allPropertyTypeContainer.multipleReferenceOfAnyContentObjectOfTypeTestAndExtendedTest", "testContentObjectJoinInSearchForAllPropertyTypeContainerMultipleReferenceOfAnyContentObjectOfTypeTestAndExtendedTestPropertyReferenceOfType"+EXTENDED_TEST_CONTENT_TYPE, EXTENDED_TEST_CONTENT_TYPE);
createContentObjectReferenceForPropertyAndAssertContentObjectReferenceCriterionInSearch(systemUser, mainContentObject, contentObjectCriteria, "allPropertyTypeContainerMultiple[0].simpleContentObject", "testContentObjectJoinInSearchForAllPropertyTypeContainerMultipleSimpleContentObjectPropertyReferenceOfType"+TEST_CONTENT_TYPE, TEST_CONTENT_TYPE);
createContentObjectReferenceForPropertyAndAssertContentObjectReferenceCriterionInSearch(systemUser, mainContentObject, contentObjectCriteria, "allPropertyTypeContainerMultiple[0].simpleContentObject", "testContentObjectJoinInSearchForAllPropertyTypeContainerMultipleSimpleContentObjectPropertyReferenceOfType"+EXTENDED_TEST_CONTENT_TYPE, EXTENDED_TEST_CONTENT_TYPE);
createContentObjectReferenceForPropertyAndAssertContentObjectReferenceCriterionInSearch(systemUser, mainContentObject, contentObjectCriteria, "allPropertyTypeContainerMultiple[0].simpleContentObject", "testContentObjectJoinInSearchForAllPropertyTypeContainerMultipleSimpleContentObjectPropertyReferenceOfType"+DIRECT_EXTENDED_TEST_CONTENT_TYPE, DIRECT_EXTENDED_TEST_CONTENT_TYPE);
createContentObjectReferenceForPropertyAndAssertContentObjectReferenceCriterionInSearch(systemUser, mainContentObject, contentObjectCriteria, "allPropertyTypeContainerMultiple[0].simpleContentObjectMultiple", "testContentObjectJoinInSearchForAllPropertyTypeContainerMultipleSimpleContentObjectMultiplePropertyReferenceOfType"+TEST_CONTENT_TYPE, TEST_CONTENT_TYPE);
createContentObjectReferenceForPropertyAndAssertContentObjectReferenceCriterionInSearch(systemUser, mainContentObject, contentObjectCriteria, "allPropertyTypeContainerMultiple[0].simpleContentObjectMultiple", "testContentObjectJoinInSearchForAllPropertyTypeContainerMultipleSimpleContentObjectMultiplePropertyReferenceOfType"+EXTENDED_TEST_CONTENT_TYPE, EXTENDED_TEST_CONTENT_TYPE);
createContentObjectReferenceForPropertyAndAssertContentObjectReferenceCriterionInSearch(systemUser, mainContentObject, contentObjectCriteria, "allPropertyTypeContainerMultiple[0].simpleContentObjectMultiple", "testContentObjectJoinInSearchForAllPropertyTypeContainerMultipleSimpleContentObjectMultiplePropertyReferenceOfType"+DIRECT_EXTENDED_TEST_CONTENT_TYPE, DIRECT_EXTENDED_TEST_CONTENT_TYPE);
createContentObjectReferenceForPropertyAndAssertContentObjectReferenceCriterionInSearch(systemUser, mainContentObject, contentObjectCriteria, "allPropertyTypeContainerMultiple[0].referenceOfAnyContentObjectOfTypeTestType", "testContentObjectJoinInSearchForAllPropertyTypeContainerMultipleSingleReferenceOfAnyContentObjectOfTypeTestTypePropertyReferenceOfType"+TEST_CONTENT_TYPE, TEST_CONTENT_TYPE);
createContentObjectReferenceForPropertyAndAssertContentObjectReferenceCriterionInSearch(systemUser, mainContentObject, contentObjectCriteria, "allPropertyTypeContainerMultiple[0].referenceOfAnyContentObjectOfTypeTestType", "testContentObjectJoinInSearchForAllPropertyTypeContainerMultipleSingleReferenceOfAnyContentObjectOfTypeTestTypePropertyReferenceOfType"+EXTENDED_TEST_CONTENT_TYPE, EXTENDED_TEST_CONTENT_TYPE);
createContentObjectReferenceForPropertyAndAssertContentObjectReferenceCriterionInSearch(systemUser, mainContentObject, contentObjectCriteria, "allPropertyTypeContainerMultiple[0].referenceOfAnyContentObjectOfTypeTestType", "testContentObjectJoinInSearchForAllPropertyTypeContainerMultipleSingleReferenceOfAnyContentObjectOfTypeTestTypePropertyReferenceOfType"+DIRECT_EXTENDED_TEST_CONTENT_TYPE, DIRECT_EXTENDED_TEST_CONTENT_TYPE);
createContentObjectReferenceForPropertyAndAssertContentObjectReferenceCriterionInSearch(systemUser, mainContentObject, contentObjectCriteria, "allPropertyTypeContainerMultiple[0].multipleReferenceOfAnyContentObjectOfTypeTestType", "testContentObjectJoinInSearchForAllPropertyTypeContainerMultipleMultipleReferenceOfAnyContentObjectOfTypeTestTypePropertyReferenceOfType"+TEST_CONTENT_TYPE, TEST_CONTENT_TYPE);
createContentObjectReferenceForPropertyAndAssertContentObjectReferenceCriterionInSearch(systemUser, mainContentObject, contentObjectCriteria, "allPropertyTypeContainerMultiple[0].multipleReferenceOfAnyContentObjectOfTypeTestType", "testContentObjectJoinInSearchForAllPropertyTypeContainerMultipleMultipleReferenceOfAnyContentObjectOfTypeTestTypePropertyReferenceOfType"+EXTENDED_TEST_CONTENT_TYPE, EXTENDED_TEST_CONTENT_TYPE);
createContentObjectReferenceForPropertyAndAssertContentObjectReferenceCriterionInSearch(systemUser, mainContentObject, contentObjectCriteria, "allPropertyTypeContainerMultiple[0].multipleReferenceOfAnyContentObjectOfTypeTestType", "testContentObjectJoinInSearchForAllPropertyTypeContainerMultipleMultipleReferenceOfAnyContentObjectOfTypeTestTypePropertyReferenceOfType"+DIRECT_EXTENDED_TEST_CONTENT_TYPE, DIRECT_EXTENDED_TEST_CONTENT_TYPE);
createContentObjectReferenceForPropertyAndAssertContentObjectReferenceCriterionInSearch(systemUser, mainContentObject, contentObjectCriteria, "allPropertyTypeContainerMultiple[0].referenceOfAnyContentObjectOfTypeTest", "testContentObjectJoinInSearchForAllPropertyTypeContainerMultipleSingleReferenceOfAnyContentObjectOfTypeTestPropertyReferenceOfType"+TEST_CONTENT_TYPE, TEST_CONTENT_TYPE);
createContentObjectReferenceForPropertyAndAssertContentObjectReferenceCriterionInSearch(systemUser, mainContentObject, contentObjectCriteria, "allPropertyTypeContainerMultiple[0].multipleReferenceOfAnyContentObjectOfTypeTest", "testContentObjectJoinInSearchForAllPropertyTypeContainerMultipleMultipleReferenceOfAnyContentObjectOfTypeTestPropertyReferenceOfType"+TEST_CONTENT_TYPE, TEST_CONTENT_TYPE);
createContentObjectReferenceForPropertyAndAssertContentObjectReferenceCriterionInSearch(systemUser, mainContentObject, contentObjectCriteria, "allPropertyTypeContainerMultiple[0].referenceOfAnyContentObjectOfTypeTestAndExtendedTest", "testContentObjectJoinInSearchForAllPropertyTypeContainerMultipleSingleReferenceOfAnyContentObjectOfTypeTestAndExtendedTestPropertyReferenceOfType"+TEST_CONTENT_TYPE, TEST_CONTENT_TYPE);
createContentObjectReferenceForPropertyAndAssertContentObjectReferenceCriterionInSearch(systemUser, mainContentObject, contentObjectCriteria, "allPropertyTypeContainerMultiple[0].referenceOfAnyContentObjectOfTypeTestAndExtendedTest", "testContentObjectJoinInSearchForAllPropertyTypeContainerMultipleSingleReferenceOfAnyContentObjectOfTypeTestAndExtendedTestPropertyReferenceOfType"+EXTENDED_TEST_CONTENT_TYPE, EXTENDED_TEST_CONTENT_TYPE);
createContentObjectReferenceForPropertyAndAssertContentObjectReferenceCriterionInSearch(systemUser, mainContentObject, contentObjectCriteria, "allPropertyTypeContainerMultiple[0].multipleReferenceOfAnyContentObjectOfTypeTestAndExtendedTest", "testContentObjectJoinInSearchForAllPropertyTypeContainerMultipleMultipleReferenceOfAnyContentObjectOfTypeTestAndExtendedTestPropertyReferenceOfType"+TEST_CONTENT_TYPE, TEST_CONTENT_TYPE);
createContentObjectReferenceForPropertyAndAssertContentObjectReferenceCriterionInSearch(systemUser, mainContentObject, contentObjectCriteria, "allPropertyTypeContainerMultiple[0].multipleReferenceOfAnyContentObjectOfTypeTestAndExtendedTest", "testContentObjectJoinInSearchForAllPropertyTypeContainerMultipleMultipleReferenceOfAnyContentObjectOfTypeTestAndExtendedTestPropertyReferenceOfType"+EXTENDED_TEST_CONTENT_TYPE, EXTENDED_TEST_CONTENT_TYPE);
}
private void createContentObjectReferenceForPropertyAndAssertContentObjectReferenceCriterionInSearch(
RepositoryUser systemUser, ContentObject mainContentObject,
ContentObjectCriteria contentObjectCriteria, String propertyPath, String referenceSystemName, String referenceType) {
ContentObject contentObjectUsedForReference = createAndPublishSpecificContentObject(systemUser,referenceSystemName, referenceType);
((ObjectReferenceProperty)mainContentObject.getCmsProperty(propertyPath)).addSimpleTypeValue(contentObjectUsedForReference);
contentService.save(mainContentObject, false, true, null);
String propertyPathWithNoIndeces = propertyPath.replaceAll("\\[.*\\]", "");
contentObjectCriteria.reset();
contentObjectCriteria.addCriterion(CriterionFactory.equals(propertyPathWithNoIndeces, CmsConstants.CONTENT_OBJECT_REFERENCE_CRITERION_VALUE_PREFIX+referenceSystemName));
assertResult(contentObjectCriteria, 1, mainContentObject.getSystemName());
contentObjectCriteria.reset();
contentObjectCriteria.addCriterion(CriterionFactory.newContentObjectReferenceCriterion(propertyPathWithNoIndeces, contentObjectUsedForReference, QueryOperator.EQUALS));
assertResult(contentObjectCriteria, 1, mainContentObject.getSystemName());
contentObjectCriteria.reset();
contentObjectCriteria.addCriterion(CriterionFactory.newContentObjectReferenceCriterion(propertyPathWithNoIndeces, contentObjectUsedForReference.getId(), QueryOperator.EQUALS));
assertResult(contentObjectCriteria, 1, mainContentObject.getSystemName());
contentObjectCriteria.reset();
contentObjectCriteria.addCriterion(CriterionFactory.newContentObjectReferenceCriterion(propertyPathWithNoIndeces, contentObjectUsedForReference.getSystemName(), QueryOperator.EQUALS));
assertResult(contentObjectCriteria, 1, mainContentObject.getSystemName());
contentObjectCriteria.reset();
contentObjectCriteria.addCriterion(CriterionFactory.newContentObjectReferenceCriterion(propertyPathWithNoIndeces, Arrays.asList(contentObjectUsedForReference), Condition.AND, QueryOperator.EQUALS));
assertResult(contentObjectCriteria, 1, mainContentObject.getSystemName());
contentObjectCriteria.reset();
contentObjectCriteria.addCriterion(CriterionFactory.newContentObjectReferenceCriterion(propertyPathWithNoIndeces, Arrays.asList(contentObjectUsedForReference.getId()), Condition.AND, QueryOperator.EQUALS));
assertResult(contentObjectCriteria, 1, mainContentObject.getSystemName());
contentObjectCriteria.reset();
contentObjectCriteria.addCriterion(CriterionFactory.newContentObjectReferenceCriterion(propertyPathWithNoIndeces, Arrays.asList(contentObjectUsedForReference.getSystemName()), Condition.AND, QueryOperator.EQUALS));
assertResult(contentObjectCriteria, 1, mainContentObject.getSystemName());
ContentObjectReferenceCriterion contentObjectReferenceCriterion = new ContentObjectReferenceCritetionImpl();
List values = new ArrayList();
contentObjectCriteria.reset();
contentObjectCriteria.addCriterion(contentObjectReferenceCriterion);
contentObjectReferenceCriterion.setProperty(propertyPathWithNoIndeces);
contentObjectReferenceCriterion.addValue(contentObjectUsedForReference.getId());
assertResult(contentObjectCriteria, 1, mainContentObject.getSystemName());
contentObjectCriteria.reset();
contentObjectCriteria.addCriterion(contentObjectReferenceCriterion);
contentObjectReferenceCriterion.clearValues();
contentObjectReferenceCriterion.addValue(CmsConstants.CONTENT_OBJECT_REFERENCE_CRITERION_VALUE_PREFIX+contentObjectUsedForReference.getSystemName());
assertResult(contentObjectCriteria, 1, mainContentObject.getSystemName());
contentObjectCriteria.reset();
contentObjectCriteria.addCriterion(contentObjectReferenceCriterion);
contentObjectReferenceCriterion.clearValues();
values.clear();
values.add(contentObjectUsedForReference.getId());
contentObjectReferenceCriterion.setValues(values);
assertResult(contentObjectCriteria, 1, mainContentObject.getSystemName());
contentObjectCriteria.reset();
contentObjectCriteria.addCriterion(contentObjectReferenceCriterion);
contentObjectReferenceCriterion.clearValues();
values.clear();
values.add(CmsConstants.CONTENT_OBJECT_REFERENCE_CRITERION_VALUE_PREFIX+contentObjectUsedForReference.getSystemName());
contentObjectReferenceCriterion.setValues(values);
assertResult(contentObjectCriteria, 1, mainContentObject.getSystemName());
}
private ContentObject createAndPublishSpecificContentObject(RepositoryUser systemUser, String systemName, String type) {
ContentObject contentObject = createContentObjectForType(type, systemUser, systemName);
((StringProperty)contentObject.getCmsProperty("profile.contentObjectStatus")).setSimpleTypeValue(ContentObjectStatus.published.toString());
contentObject = contentService.save(contentObject, false, true, null);
markObjectForRemoval(contentObject);
return contentObject;
}
@Test
public void testSearchContentObjects() throws Throwable{
RepositoryUser systemUser = getSystemUser();
for (int i=0;i<10;i++){
ContentObject contentObject = createContentObject(systemUser, "testSearchContentObjects"+i);
((StringProperty)contentObject.getCmsProperty("profile.contentObjectStatus")).setSimpleTypeValue(ContentObjectStatus.published.toString());
((StringProperty)contentObject.getCmsProperty("profile.title")).setSimpleTypeValue("testSearchContentObjects");
//Default values will be loaded
contentObject.getCmsProperty("stringEnum");
contentObject.getCmsProperty("longEnum");
contentObject = contentService.save(contentObject, false, true, null);
markObjectForRemoval(contentObject);
}
ContentObjectCriteria contentObjectCriteria = CmsCriteriaFactory.newContentObjectCriteria();
contentObjectCriteria.addCriterion(CriterionFactory.equals("profile.title", "testSearchContentObjects"));
contentObjectCriteria.addOrderProperty("profile.title", Order.ascending);
//Export to XML as String
long time = System.currentTimeMillis();
String xml = contentService.searchContentObjects(contentObjectCriteria, ResourceRepresentationType.XML);
logger.debug("Brought 10 content objects in XML string in {}", (System.currentTimeMillis() - time) +" ms");
jaxbValidationUtils.validateUsingSAX(xml);
//Export to XML as String but use the same name for all content object. Do not validate it
contentObjectCriteria.getRenderProperties().serializeContentObjectsUsingTheSameNameAsCollectionItemName(true);
String xmlWithSameElementNameForContentObjects = contentService.searchContentObjects(contentObjectCriteria, ResourceRepresentationType.XML);
logger.debug("XML with same content object names \n {}", TestUtils.prettyPrintXml(xmlWithSameElementNameForContentObjects));
//Run query again and for each returned content object compare xml export with
//xml provided by appropriate method
contentObjectCriteria.getRenderProperties().serializeContentObjectsUsingTheSameNameAsCollectionItemName(false);
contentObjectCriteria.getRenderProperties().renderParentEntity(true);
CmsOutcome<ContentObject> outcome = contentService.searchContentObjects(contentObjectCriteria, ResourceRepresentationType.CONTENT_OBJECT_LIST);
for (ContentObject co : outcome.getResults()){
PersistMode persistModeForLog = null;
for (PersistMode persistMode : PersistMode.values()){
persistModeForLog = persistMode;
ImportConfiguration configuration = ImportConfiguration.object()
.persist(persistMode)
.version(false)
.updateLastModificationTime(true)
.build();
String coXml = co.xml(prettyPrint);
ContentObject coFromXml = importDao.importContentObject(coXml, configuration);
String coXmlFromServiceWithId = contentService.getContentObject(co.getId(), ResourceRepresentationType.XML, FetchLevel.FULL,
CacheRegion.NONE, null, false);
configuration = ImportConfiguration.object()
.persist(persistMode)
.version(false)
.updateLastModificationTime(false)
.build();
ContentObject coFromServiceWithId = importDao.importContentObject(coXmlFromServiceWithId, configuration);
try{
repositoryContentValidator.compareContentObjects(coFromXml, coFromServiceWithId, true);
}
catch(Throwable e){
logger.error("PersistMode \n{}",persistModeForLog);
logger.error("Initial \n{}",TestUtils.prettyPrintXml(coXml));
logger.error("Using Id \n{}",TestUtils.prettyPrintXml(coXmlFromServiceWithId));
throw e;
}
if (PersistMode.DO_NOT_PERSIST != persistMode){
co = coFromServiceWithId;
}
}
}
}
@Test
public void testBinaryChannelURLs() throws Exception{
//Create content objects for test
RepositoryUser systemUser = getSystemUser();
ContentObject contentObject = createContentObject(systemUser, "imageURLs");
BinaryChannel logoBinaryChannel = loadManagedBinaryChannel(logo, "image");
BinaryChannel logo2BinaryChannel = loadManagedBinaryChannel(logo2, "image");
//Add two binary channels in property image
BinaryProperty imageProperty = (BinaryProperty)contentObject.getCmsProperty("image");
imageProperty.addSimpleTypeValue(logoBinaryChannel);
imageProperty.addSimpleTypeValue(logo2BinaryChannel);
contentObject = contentService.save(contentObject, false, true, null);
markObjectForRemoval(contentObject);
//Check that existent instances have been updated with repository and host parameters
assertBinaryChannelURLs(logoBinaryChannel, imageProperty.getPermanentPath(), contentObject);
assertBinaryChannelURLs(logo2BinaryChannel, imageProperty.getPermanentPath(), contentObject);
ContentObject contentObjectReloaded = contentService.getContentObject(contentObject.getId(), ResourceRepresentationType.CONTENT_OBJECT_INSTANCE,
FetchLevel.ENTITY, CacheRegion.NONE, null, false);
imageProperty = (BinaryProperty)contentObjectReloaded.getCmsProperty("image");
Assert.assertTrue(imageProperty.hasValues(), "No binary channel saved for image property");
Assert.assertTrue(imageProperty.getSimpleTypeValues().size()==2, "Should have saved 2 binary channels for image property");
for (BinaryChannel imageBinaryChannel : imageProperty.getSimpleTypeValues()){
final int index = imageProperty.getSimpleTypeValues().indexOf(imageBinaryChannel);
String indexAsString = index == 0 ? "" : "["+index+"]";
//Check that existent instances have been updated with repository and host parameters
assertBinaryChannelURLs(imageBinaryChannel, imageProperty.getPermanentPath(), contentObjectReloaded);
}
//Add another image
BinaryChannel logo3BinaryChannel = loadManagedBinaryChannel(logo2, "image");
imageProperty.addSimpleTypeValue(logo3BinaryChannel);
contentObject = contentService.save(contentObjectReloaded, false, true, null);
//Now recheck urls
assertBinaryChannelURLs(logo3BinaryChannel, imageProperty.getPermanentPath(), contentObject);
//remove the first image
contentObjectReloaded = contentService.getContentObject(contentObject.getId(), ResourceRepresentationType.CONTENT_OBJECT_INSTANCE, FetchLevel.ENTITY, null, null, false);
imageProperty = (BinaryProperty)contentObjectReloaded.getCmsProperty("image");
imageProperty.removeSimpleTypeValue(0);
contentObjectReloaded = contentService.save(contentObjectReloaded, false, true, null);
imageProperty = (BinaryProperty)contentObjectReloaded.getCmsProperty("image");
for (BinaryChannel imageBinaryChannel : imageProperty.getSimpleTypeValues()){
final int index = imageProperty.getSimpleTypeValues().indexOf(imageBinaryChannel);
String indexAsString = index == 0 ? "" : "["+index+"]";
//Check that existent instances have been updated with repository and host parameters
assertBinaryChannelURLs(imageBinaryChannel, imageProperty.getPermanentPath(), contentObjectReloaded);
}
}
private void assertBinaryChannelURLs(BinaryChannel binaryChannel, String binaryPropertyPermanentPath, ContentObject contentObject) {
String contentApiURL = AstroboaClientContextHolder.getActiveCmsRepository().getRestfulApiBasePath();
String serverBaseURL = AstroboaClientContextHolder.getActiveCmsRepository().getServerURL();
final String expectedBaseUrl = serverBaseURL + contentApiURL+"/"+TestConstants.TEST_REPOSITORY_ID+CmsConstants.RESOURCE_API_OBJECTS_COLLECTION_URI_PATH+"/";
final String expectedRelativeBaseUrl = contentApiURL+"/"+TestConstants.TEST_REPOSITORY_ID+CmsConstants.RESOURCE_API_OBJECTS_COLLECTION_URI_PATH+"/";
Assert.assertEquals(binaryChannel.buildResourceApiURL(null, null, null, null, null, true, false), expectedBaseUrl+contentObject.getSystemName()+ "/"+binaryPropertyPermanentPath+ "["+binaryChannel.getId()+"]", "Invalid resource api URL");
Assert.assertEquals(binaryChannel.buildResourceApiURL(null, null, null, null, null, false, false), expectedBaseUrl+contentObject.getId()+ "/"+binaryPropertyPermanentPath+ "["+binaryChannel.getId()+"]", "Invalid resource api URL");
Assert.assertEquals(binaryChannel.buildResourceApiURL(null, null, null, null, null, false, true), expectedRelativeBaseUrl+contentObject.getId()+ "/"+binaryPropertyPermanentPath+ "["+binaryChannel.getId()+"]", "Invalid resource api URL");
Assert.assertEquals(binaryChannel.buildResourceApiURL(null, null, null, null, null, true, true), expectedRelativeBaseUrl+contentObject.getSystemName()+ "/"+binaryPropertyPermanentPath+ "["+binaryChannel.getId()+"]", "Invalid resource api URL");
}
private void assertResult(ContentObjectCriteria contentObjectCriteria, int totalCount, String expectedContentObjectName) {
contentObjectCriteria.setOffsetAndLimit(0, 1);
CmsOutcome<ContentObject> outcome = contentService.searchContentObjects(contentObjectCriteria, ResourceRepresentationType.CONTENT_OBJECT_LIST);
Assert.assertEquals(outcome.getCount(), totalCount, "Total count invalid. Query "+ contentObjectCriteria.getXPathQuery());
if (totalCount > 0){
Assert.assertEquals(outcome.getResults().get(0).getSystemName(), expectedContentObjectName, "Invalid content object name. Query "+
contentObjectCriteria.getXPathQuery());
}
}
@Test
public void testSaveOfContentObjectPropertyWhichAcceptsAnyContentObjectOfSomeType(){
//Create main content object
ContentObject mainContentObject = createContentObjectForType(TEST_CONTENT_TYPE, getSystemUser(), "mainContentObject");
mainContentObject = contentService.save(mainContentObject, false, true, null);
markObjectForRemoval(mainContentObject);
assertSaveOfContentObjectReference(mainContentObject, TEST_CONTENT_TYPE, "referenceOfAnyContentObjectOfTypeTestType", false);
assertSaveOfContentObjectReference(mainContentObject, EXTENDED_TEST_CONTENT_TYPE, "referenceOfAnyContentObjectOfTypeTestType",false);
assertSaveOfContentObjectReference(mainContentObject, DIRECT_EXTENDED_TEST_CONTENT_TYPE, "referenceOfAnyContentObjectOfTypeTestType", false);
assertSaveOfContentObjectReference(mainContentObject, TEST_CONTENT_TYPE, "multipleReferenceOfAnyContentObjectOfTypeTestType", false);
assertSaveOfContentObjectReference(mainContentObject, EXTENDED_TEST_CONTENT_TYPE, "multipleReferenceOfAnyContentObjectOfTypeTestType", false);
assertSaveOfContentObjectReference(mainContentObject, DIRECT_EXTENDED_TEST_CONTENT_TYPE, "multipleReferenceOfAnyContentObjectOfTypeTestType", false);
assertSaveOfContentObjectReference(mainContentObject, TEST_CONTENT_TYPE, "allPropertyTypeContainer.referenceOfAnyContentObjectOfTypeTestType", false);
assertSaveOfContentObjectReference(mainContentObject, EXTENDED_TEST_CONTENT_TYPE, "allPropertyTypeContainer.referenceOfAnyContentObjectOfTypeTestType", false);
assertSaveOfContentObjectReference(mainContentObject, DIRECT_EXTENDED_TEST_CONTENT_TYPE, "allPropertyTypeContainer.referenceOfAnyContentObjectOfTypeTestType", false);
assertSaveOfContentObjectReference(mainContentObject, TEST_CONTENT_TYPE, "allPropertyTypeContainer.multipleReferenceOfAnyContentObjectOfTypeTestType", false);
assertSaveOfContentObjectReference(mainContentObject, EXTENDED_TEST_CONTENT_TYPE, "allPropertyTypeContainer.multipleReferenceOfAnyContentObjectOfTypeTestType", false);
assertSaveOfContentObjectReference(mainContentObject, DIRECT_EXTENDED_TEST_CONTENT_TYPE, "allPropertyTypeContainer.multipleReferenceOfAnyContentObjectOfTypeTestType", false);
assertSaveOfContentObjectReference(mainContentObject, TEST_CONTENT_TYPE, "allPropertyTypeContainerMultiple[0].referenceOfAnyContentObjectOfTypeTestType", false);
assertSaveOfContentObjectReference(mainContentObject, EXTENDED_TEST_CONTENT_TYPE, "allPropertyTypeContainerMultiple[0].referenceOfAnyContentObjectOfTypeTestType", false);
assertSaveOfContentObjectReference(mainContentObject, DIRECT_EXTENDED_TEST_CONTENT_TYPE, "allPropertyTypeContainerMultiple[0].referenceOfAnyContentObjectOfTypeTestType", false);
assertSaveOfContentObjectReference(mainContentObject, TEST_CONTENT_TYPE, "allPropertyTypeContainerMultiple[0].multipleReferenceOfAnyContentObjectOfTypeTestType", false);
assertSaveOfContentObjectReference(mainContentObject, EXTENDED_TEST_CONTENT_TYPE, "allPropertyTypeContainerMultiple[0].multipleReferenceOfAnyContentObjectOfTypeTestType", false);
assertSaveOfContentObjectReference(mainContentObject, DIRECT_EXTENDED_TEST_CONTENT_TYPE, "allPropertyTypeContainerMultiple[0].multipleReferenceOfAnyContentObjectOfTypeTestType", false);
assertSaveOfContentObjectReference(mainContentObject, TEST_CONTENT_TYPE, "referenceOfAnyContentObjectOfTypeTest", false);
assertSaveOfContentObjectReference(mainContentObject, EXTENDED_TEST_CONTENT_TYPE, "referenceOfAnyContentObjectOfTypeTest",true);
assertSaveOfContentObjectReference(mainContentObject, DIRECT_EXTENDED_TEST_CONTENT_TYPE, "referenceOfAnyContentObjectOfTypeTest", true);
assertSaveOfContentObjectReference(mainContentObject, TEST_CONTENT_TYPE, "multipleReferenceOfAnyContentObjectOfTypeTest", false);
assertSaveOfContentObjectReference(mainContentObject, EXTENDED_TEST_CONTENT_TYPE, "multipleReferenceOfAnyContentObjectOfTypeTest", true);
assertSaveOfContentObjectReference(mainContentObject, DIRECT_EXTENDED_TEST_CONTENT_TYPE, "multipleReferenceOfAnyContentObjectOfTypeTest", true);
assertSaveOfContentObjectReference(mainContentObject, TEST_CONTENT_TYPE, "allPropertyTypeContainer.referenceOfAnyContentObjectOfTypeTest", false);
assertSaveOfContentObjectReference(mainContentObject, EXTENDED_TEST_CONTENT_TYPE, "allPropertyTypeContainer.referenceOfAnyContentObjectOfTypeTest", true);
assertSaveOfContentObjectReference(mainContentObject, DIRECT_EXTENDED_TEST_CONTENT_TYPE, "allPropertyTypeContainer.referenceOfAnyContentObjectOfTypeTest", true);
assertSaveOfContentObjectReference(mainContentObject, TEST_CONTENT_TYPE, "allPropertyTypeContainer.multipleReferenceOfAnyContentObjectOfTypeTest", false);
assertSaveOfContentObjectReference(mainContentObject, EXTENDED_TEST_CONTENT_TYPE, "allPropertyTypeContainer.multipleReferenceOfAnyContentObjectOfTypeTest", true);
assertSaveOfContentObjectReference(mainContentObject, DIRECT_EXTENDED_TEST_CONTENT_TYPE, "allPropertyTypeContainer.multipleReferenceOfAnyContentObjectOfTypeTest", true);
assertSaveOfContentObjectReference(mainContentObject, TEST_CONTENT_TYPE, "allPropertyTypeContainerMultiple[0].referenceOfAnyContentObjectOfTypeTest", false);
assertSaveOfContentObjectReference(mainContentObject, EXTENDED_TEST_CONTENT_TYPE, "allPropertyTypeContainerMultiple[0].referenceOfAnyContentObjectOfTypeTest", true);
assertSaveOfContentObjectReference(mainContentObject, DIRECT_EXTENDED_TEST_CONTENT_TYPE, "allPropertyTypeContainerMultiple[0].referenceOfAnyContentObjectOfTypeTest", true);
assertSaveOfContentObjectReference(mainContentObject, TEST_CONTENT_TYPE, "allPropertyTypeContainerMultiple[0].multipleReferenceOfAnyContentObjectOfTypeTest", false);
assertSaveOfContentObjectReference(mainContentObject, EXTENDED_TEST_CONTENT_TYPE, "allPropertyTypeContainerMultiple[0].multipleReferenceOfAnyContentObjectOfTypeTest", true);
assertSaveOfContentObjectReference(mainContentObject, DIRECT_EXTENDED_TEST_CONTENT_TYPE, "allPropertyTypeContainerMultiple[0].multipleReferenceOfAnyContentObjectOfTypeTest", true);
assertSaveOfContentObjectReference(mainContentObject, TEST_CONTENT_TYPE, "referenceOfAnyContentObjectOfTypeTestAndExtendedTest", false);
assertSaveOfContentObjectReference(mainContentObject, EXTENDED_TEST_CONTENT_TYPE, "referenceOfAnyContentObjectOfTypeTestAndExtendedTest",false);
assertSaveOfContentObjectReference(mainContentObject, DIRECT_EXTENDED_TEST_CONTENT_TYPE, "referenceOfAnyContentObjectOfTypeTestAndExtendedTest", true);
assertSaveOfContentObjectReference(mainContentObject, TEST_CONTENT_TYPE, "multipleReferenceOfAnyContentObjectOfTypeTestAndExtendedTest", false);
assertSaveOfContentObjectReference(mainContentObject, EXTENDED_TEST_CONTENT_TYPE, "multipleReferenceOfAnyContentObjectOfTypeTestAndExtendedTest", false);
assertSaveOfContentObjectReference(mainContentObject, DIRECT_EXTENDED_TEST_CONTENT_TYPE, "multipleReferenceOfAnyContentObjectOfTypeTestAndExtendedTest", true);
assertSaveOfContentObjectReference(mainContentObject, TEST_CONTENT_TYPE, "allPropertyTypeContainer.referenceOfAnyContentObjectOfTypeTestAndExtendedTest", false);
assertSaveOfContentObjectReference(mainContentObject, EXTENDED_TEST_CONTENT_TYPE, "allPropertyTypeContainer.referenceOfAnyContentObjectOfTypeTestAndExtendedTest", false);
assertSaveOfContentObjectReference(mainContentObject, DIRECT_EXTENDED_TEST_CONTENT_TYPE, "allPropertyTypeContainer.referenceOfAnyContentObjectOfTypeTestAndExtendedTest", true);
assertSaveOfContentObjectReference(mainContentObject, TEST_CONTENT_TYPE, "allPropertyTypeContainer.multipleReferenceOfAnyContentObjectOfTypeTestAndExtendedTest", false);
assertSaveOfContentObjectReference(mainContentObject, EXTENDED_TEST_CONTENT_TYPE, "allPropertyTypeContainer.multipleReferenceOfAnyContentObjectOfTypeTestAndExtendedTest", false);
assertSaveOfContentObjectReference(mainContentObject, DIRECT_EXTENDED_TEST_CONTENT_TYPE, "allPropertyTypeContainer.multipleReferenceOfAnyContentObjectOfTypeTestAndExtendedTest", true);
assertSaveOfContentObjectReference(mainContentObject, TEST_CONTENT_TYPE, "allPropertyTypeContainerMultiple[0].referenceOfAnyContentObjectOfTypeTestAndExtendedTest", false);
assertSaveOfContentObjectReference(mainContentObject, EXTENDED_TEST_CONTENT_TYPE, "allPropertyTypeContainerMultiple[0].referenceOfAnyContentObjectOfTypeTestAndExtendedTest", false);
assertSaveOfContentObjectReference(mainContentObject, DIRECT_EXTENDED_TEST_CONTENT_TYPE, "allPropertyTypeContainerMultiple[0].referenceOfAnyContentObjectOfTypeTestAndExtendedTest", true);
assertSaveOfContentObjectReference(mainContentObject, TEST_CONTENT_TYPE, "allPropertyTypeContainerMultiple[0].multipleReferenceOfAnyContentObjectOfTypeTestAndExtendedTest", false);
assertSaveOfContentObjectReference(mainContentObject, EXTENDED_TEST_CONTENT_TYPE, "allPropertyTypeContainerMultiple[0].multipleReferenceOfAnyContentObjectOfTypeTestAndExtendedTest", false);
assertSaveOfContentObjectReference(mainContentObject, DIRECT_EXTENDED_TEST_CONTENT_TYPE, "allPropertyTypeContainerMultiple[0].multipleReferenceOfAnyContentObjectOfTypeTestAndExtendedTest", true);
assertSaveOfContentObjectReference(mainContentObject, "personObject", "referenceOfAnyContentObjectOfTypeTestType", true);
assertSaveOfContentObjectReference(mainContentObject, "personObject", "multipleReferenceOfAnyContentObjectOfTypeTestType", true);
assertSaveOfContentObjectReference(mainContentObject, "personObject", "allPropertyTypeContainer.referenceOfAnyContentObjectOfTypeTestType", true);
assertSaveOfContentObjectReference(mainContentObject, "personObject", "allPropertyTypeContainer.multipleReferenceOfAnyContentObjectOfTypeTestType", true);
assertSaveOfContentObjectReference(mainContentObject, "personObject", "allPropertyTypeContainerMultiple[0].referenceOfAnyContentObjectOfTypeTestType", true);
assertSaveOfContentObjectReference(mainContentObject, "personObject", "allPropertyTypeContainerMultiple[0].multipleReferenceOfAnyContentObjectOfTypeTestType", true);
assertSaveOfContentObjectReference(mainContentObject, "personObject", "referenceOfAnyContentObjectOfTypeTest", true);
assertSaveOfContentObjectReference(mainContentObject, "personObject", "multipleReferenceOfAnyContentObjectOfTypeTest", true);
assertSaveOfContentObjectReference(mainContentObject, "personObject", "allPropertyTypeContainer.referenceOfAnyContentObjectOfTypeTest", true);
assertSaveOfContentObjectReference(mainContentObject, "personObject", "allPropertyTypeContainer.multipleReferenceOfAnyContentObjectOfTypeTest", true);
assertSaveOfContentObjectReference(mainContentObject, "personObject", "allPropertyTypeContainerMultiple[0].referenceOfAnyContentObjectOfTypeTest", true);
assertSaveOfContentObjectReference(mainContentObject, "personObject", "allPropertyTypeContainerMultiple[0].multipleReferenceOfAnyContentObjectOfTypeTest", true);
assertSaveOfContentObjectReference(mainContentObject, "personObject", "referenceOfAnyContentObjectOfTypeTestAndExtendedTest", true);
assertSaveOfContentObjectReference(mainContentObject, "personObject", "multipleReferenceOfAnyContentObjectOfTypeTestAndExtendedTest", true);
assertSaveOfContentObjectReference(mainContentObject, "personObject", "allPropertyTypeContainer.referenceOfAnyContentObjectOfTypeTestAndExtendedTest", true);
assertSaveOfContentObjectReference(mainContentObject, "personObject", "allPropertyTypeContainer.multipleReferenceOfAnyContentObjectOfTypeTestAndExtendedTest", true);
assertSaveOfContentObjectReference(mainContentObject, "personObject", "allPropertyTypeContainerMultiple[0].referenceOfAnyContentObjectOfTypeTestAndExtendedTest", true);
assertSaveOfContentObjectReference(mainContentObject, "personObject", "allPropertyTypeContainerMultiple[0].multipleReferenceOfAnyContentObjectOfTypeTestAndExtendedTest", true);
}
private void assertSaveOfContentObjectReference(ContentObject mainContentObject, String contentTypeOfContentObjectReference, String propertyPath, boolean shouldThrowException ){
ContentObject contentObject = createContentObjectForType(contentTypeOfContentObjectReference, getSystemUser(), "contentObjectOfType"+contentTypeOfContentObjectReference+propertyPath.replaceAll("\\[","").replaceAll("\\]",""));
contentObject = contentService.save(contentObject, false, true, null);
markObjectForRemoval(contentObject);
//Save reference.
ObjectReferenceProperty contentObjectProperty = (ObjectReferenceProperty)mainContentObject.getCmsProperty(propertyPath);
try{
contentObjectProperty.addSimpleTypeValue(contentObject);
contentService.save(mainContentObject, false, true , null);
}
catch(CmsException e){
if (! shouldThrowException){
throw e;
}
else{
Assert.assertEquals(e.getMessage(),
"ContentObject "+contentObject.getId()+" is of type "+contentObject.getContentObjectType()+
", property "+contentObjectProperty.getFullPath()+" accepts contentObject of the following types :'"
+contentObjectProperty.getPropertyDefinition().getExpandedAcceptedContentTypes()+
"' as values");
if (contentObjectProperty.getPropertyDefinition().isMultiple()){
contentObjectProperty.removeSimpleTypeValue(contentObjectProperty.getSimpleTypeValues().size()-1);
}
else{
contentObjectProperty.removeSimpleTypeValue(0);
}
}
}
}
@Test
public void testGetContentObjectPreFetchedPropertyMechanism() throws Throwable{
RepositoryUser systemUser = getSystemUser();
Taxonomy subjectTaxonomy = getSubjectTaxonomy();
//Create Topics
Topic topic = JAXBTestUtils.createTopic("firstTopicExportPreFetchMechanism",
cmsRepositoryEntityFactory.newTopic(),
cmsRepositoryEntityFactory.newRepositoryUser());
topic.setOwner(systemUser);
topic.setTaxonomy(subjectTaxonomy);
Topic childTopic1 = JAXBTestUtils.createTopic("secondTopicExportPreFetchMechanism",
cmsRepositoryEntityFactory.newTopic(),
cmsRepositoryEntityFactory.newRepositoryUser());
childTopic1.setOwner(topic.getOwner());
childTopic1.setTaxonomy(subjectTaxonomy);
topic.addChild(childTopic1);
topic = topicService.save(topic);
markTopicForRemoval(topic);
//Create object to be used in referencec
ContentObject objectReference = createContentObject(getSystemUser(), "contentObjectTestExportPreFetchMechanismReference");
objectReference = contentService.save(objectReference, false, true, null);
markObjectForRemoval(objectReference);
ContentObject contentObject = createContentObjectAndPopulateAllProperties(getSystemUser(), "contentObjectTestExportPreFetchMechanism");
((LongProperty)contentObject.getCmsProperty("statisticTypeMultiple.viewCounter")).setSimpleTypeValue((long)1);
((LongProperty)contentObject.getCmsProperty("statisticType.viewCounter")).setSimpleTypeValue((long)1);
contentObject = contentService.save(contentObject, false, true, null);
markObjectForRemoval(contentObject);
List<String> propertyPaths = Arrays.asList("profile.created", "allPropertyTypeContainer");
final ArrayList<String> emptyPropertiesToExportList = new ArrayList<String>();
for (FetchLevel fetchLevel : FetchLevel.values()){
try{
//Resource Representation Type is ContentObject
ContentObject contentObjectReloaded = (ContentObject) contentService.getContentObject(contentObject.getId(), ResourceRepresentationType.CONTENT_OBJECT_INSTANCE, fetchLevel, CacheRegion.NONE, propertyPaths,false);
assertContentObjectHasTheProperPropertiesLoaded(contentObject, contentObjectReloaded,fetchLevel,propertyPaths);
//Resource Representation Type is ContentObject and property paths to export is null
contentObjectReloaded = (ContentObject) contentService.getContentObject(contentObject.getId(), ResourceRepresentationType.CONTENT_OBJECT_INSTANCE, fetchLevel, CacheRegion.NONE, null,false);
assertContentObjectHasTheProperPropertiesLoaded(contentObject, contentObjectReloaded,fetchLevel,null);
//Resource Representation Type is ContentObject and property paths to export is empty
contentObjectReloaded = (ContentObject) contentService.getContentObject(contentObject.getId(), ResourceRepresentationType.CONTENT_OBJECT_INSTANCE, fetchLevel, CacheRegion.NONE, emptyPropertiesToExportList,false);
assertContentObjectHasTheProperPropertiesLoaded(contentObject, contentObjectReloaded,fetchLevel,emptyPropertiesToExportList);
//Resource Representation Type is CONTENT_OBJECT_LIST
CmsOutcome<ContentObject> outcome = contentService.getContentObject(contentObject.getId(), ResourceRepresentationType.CONTENT_OBJECT_LIST, fetchLevel, CacheRegion.NONE, propertyPaths,false);
assertThatCmsOutcomeContainsOneContentObjectWithProperPropertiesLoaded(contentObject, propertyPaths, fetchLevel, outcome);
//Resource Representation Type is CONTENT_OBJECT_LIST and property paths to export is null
outcome = contentService.getContentObject(contentObject.getId(), ResourceRepresentationType.CONTENT_OBJECT_LIST, fetchLevel, CacheRegion.NONE, null,false);
assertThatCmsOutcomeContainsOneContentObjectWithProperPropertiesLoaded(contentObject, null, fetchLevel, outcome);
//Resource Representation Type is CONTENT_OBJECT_LIST and property paths to export is empty
outcome = contentService.getContentObject(contentObject.getId(), ResourceRepresentationType.CONTENT_OBJECT_LIST, fetchLevel, CacheRegion.NONE, emptyPropertiesToExportList,false);
assertThatCmsOutcomeContainsOneContentObjectWithProperPropertiesLoaded(contentObject, emptyPropertiesToExportList, fetchLevel, outcome);
//Resource Representation Type is null
contentObjectReloaded = contentService.getContentObject(contentObject.getId(), null, fetchLevel, CacheRegion.NONE, propertyPaths,false);
assertContentObjectHasTheProperPropertiesLoaded(contentObject,contentObjectReloaded,fetchLevel,propertyPaths);
//Resource Representation Type is null property paths to export is null
contentObjectReloaded = contentService.getContentObject(contentObject.getId(), null, fetchLevel, CacheRegion.NONE, null,false);
assertContentObjectHasTheProperPropertiesLoaded(contentObject,contentObjectReloaded,fetchLevel,null);
//Resource Representation Type is null and property paths to export is empty
contentObjectReloaded = contentService.getContentObject(contentObject.getId(), null, fetchLevel, CacheRegion.NONE, emptyPropertiesToExportList,false);
assertContentObjectHasTheProperPropertiesLoaded(contentObject,contentObjectReloaded,fetchLevel,emptyPropertiesToExportList);
//Resource Representation Type is XML
String xmlOrJson = contentService.getContentObject(contentObject.getId(), ResourceRepresentationType.XML, fetchLevel, CacheRegion.NONE, propertyPaths,false);
assertStringRepresentationHasTheProperPropertiesLoaded(xmlOrJson, contentObject, ResourceRepresentationType.XML, fetchLevel, propertyPaths);
//Resource Representation Type is XML and property paths to export is null
xmlOrJson = contentService.getContentObject(contentObject.getId(), ResourceRepresentationType.XML, fetchLevel, CacheRegion.NONE, null,false);
assertStringRepresentationHasTheProperPropertiesLoaded(xmlOrJson, contentObject, ResourceRepresentationType.XML, fetchLevel, null);
//Resource Representation Type is XML and property paths to export is empty
xmlOrJson = contentService.getContentObject(contentObject.getId(), ResourceRepresentationType.XML, fetchLevel, CacheRegion.NONE, emptyPropertiesToExportList,false);
assertStringRepresentationHasTheProperPropertiesLoaded(xmlOrJson, contentObject, ResourceRepresentationType.XML, fetchLevel, emptyPropertiesToExportList);
//Resource Representation Type is JSON
xmlOrJson = contentService.getContentObject(contentObject.getId(), ResourceRepresentationType.JSON, fetchLevel, CacheRegion.NONE, propertyPaths,false);
assertStringRepresentationHasTheProperPropertiesLoaded(xmlOrJson, contentObject, ResourceRepresentationType.JSON, fetchLevel, propertyPaths);
//Resource Representation Type is JSON and property paths to export is null
xmlOrJson = contentService.getContentObject(contentObject.getId(), ResourceRepresentationType.JSON, fetchLevel, CacheRegion.NONE, null,false);
assertStringRepresentationHasTheProperPropertiesLoaded(xmlOrJson, contentObject, ResourceRepresentationType.JSON, fetchLevel, null);
//Resource Representation Type is JSON and property paths to export is empty
xmlOrJson = contentService.getContentObject(contentObject.getId(), ResourceRepresentationType.JSON, fetchLevel, CacheRegion.NONE, emptyPropertiesToExportList,false);
assertStringRepresentationHasTheProperPropertiesLoaded(xmlOrJson, contentObject, ResourceRepresentationType.JSON, fetchLevel, emptyPropertiesToExportList);
}
catch(Throwable e){
logger.error("FetchLevel "+fetchLevel+ " \n Object "+ contentObject.xml(true));
throw e;
}
}
/*
*
*/
//Resource Representation Type is ContentObject and FetchLevel is null
ContentObject contentObjectReloaded = contentService.getContentObject(contentObject.getId(), ResourceRepresentationType.CONTENT_OBJECT_INSTANCE, null, CacheRegion.NONE, propertyPaths,false);
assertContentObjectHasTheProperPropertiesLoaded(contentObject, contentObjectReloaded,null, propertyPaths);
//Resource Representation Type is ContentObject , FetchLevel is null and propertyPathsToExport is null
contentObjectReloaded = contentService.getContentObject(contentObject.getId(), ResourceRepresentationType.CONTENT_OBJECT_INSTANCE, null, CacheRegion.NONE, null,false);
assertContentObjectHasTheProperPropertiesLoaded(contentObject, contentObjectReloaded,null, null);
//Resource Representation Type is ContentObject , FetchLevel is null and propertyPathsToExport is empty
contentObjectReloaded = contentService.getContentObject(contentObject.getId(), ResourceRepresentationType.CONTENT_OBJECT_INSTANCE, null, CacheRegion.NONE, emptyPropertiesToExportList,false);
assertContentObjectHasTheProperPropertiesLoaded(contentObject, contentObjectReloaded,null, emptyPropertiesToExportList);
//Resource Representation Type is null and FetchLevel is null
contentObjectReloaded = contentService.getContentObject(contentObject.getId(), null, null, CacheRegion.NONE, propertyPaths,false);
assertContentObjectHasTheProperPropertiesLoaded(contentObject, contentObjectReloaded,null,propertyPaths);
//Resource Representation Type is null and FetchLevel is null and propertyPathsToExport is null
contentObjectReloaded = contentService.getContentObject(contentObject.getId(), null, null, CacheRegion.NONE, null,false);
assertContentObjectHasTheProperPropertiesLoaded(contentObject, contentObjectReloaded,null,null);
//Resource Representation Type is null and FetchLevel is null and propertyPathsToExport is empty
contentObjectReloaded = contentService.getContentObject(contentObject.getId(), null, null, CacheRegion.NONE, emptyPropertiesToExportList,false);
assertContentObjectHasTheProperPropertiesLoaded(contentObject, contentObjectReloaded,null,emptyPropertiesToExportList);
//Resource Representation Type is CONTENT_OBJECT_LIST and FetchLevel is null
CmsOutcome<ContentObject> outcome = contentService.getContentObject(contentObject.getId(), ResourceRepresentationType.CONTENT_OBJECT_LIST, null, CacheRegion.NONE, propertyPaths,false);
assertThatCmsOutcomeContainsOneContentObjectWithProperPropertiesLoaded(contentObjectReloaded, propertyPaths, null, outcome);
//Resource Representation Type is CONTENT_OBJECT_LIST and FetchLevel is null and property paths to export is null
outcome = contentService.getContentObject(contentObject.getId(), ResourceRepresentationType.CONTENT_OBJECT_LIST, null, CacheRegion.NONE, null,false);
assertThatCmsOutcomeContainsOneContentObjectWithProperPropertiesLoaded(contentObjectReloaded, null, null, outcome);
//Resource Representation Type is CONTENT_OBJECT_LIST and FetchLevel is null and property paths to export is empty
outcome = contentService.getContentObject(contentObject.getId(), ResourceRepresentationType.CONTENT_OBJECT_LIST, null, CacheRegion.NONE, emptyPropertiesToExportList,false);
assertThatCmsOutcomeContainsOneContentObjectWithProperPropertiesLoaded(contentObjectReloaded, emptyPropertiesToExportList, null, outcome);
//Resource Representation Type is XML and FetchLevel is null
String xmlOrJson = contentService.getContentObject(contentObject.getId(), ResourceRepresentationType.XML, null, CacheRegion.NONE, propertyPaths,false);
assertStringRepresentationHasTheProperPropertiesLoaded(xmlOrJson, contentObject, ResourceRepresentationType.XML, null, propertyPaths);
//Resource Representation Type is XML and FetchLevel is null and propertyPathsToExport is null
xmlOrJson = contentService.getContentObject(contentObject.getId(), ResourceRepresentationType.XML, null, CacheRegion.NONE, null,false);
assertStringRepresentationHasTheProperPropertiesLoaded(xmlOrJson, contentObject, ResourceRepresentationType.XML, null, null);
//Resource Representation Type is XML and FetchLevel is null and propertyPathsToExport is empty
xmlOrJson = contentService.getContentObject(contentObject.getId(), ResourceRepresentationType.XML, null, CacheRegion.NONE, emptyPropertiesToExportList,false);
assertStringRepresentationHasTheProperPropertiesLoaded(xmlOrJson, contentObject, ResourceRepresentationType.XML, null, emptyPropertiesToExportList);
//Resource Representation Type is JSON and FetchLevel is null
xmlOrJson = contentService.getContentObject(contentObject.getId(), ResourceRepresentationType.JSON, null, CacheRegion.NONE, propertyPaths,false);
assertStringRepresentationHasTheProperPropertiesLoaded(xmlOrJson, contentObject, ResourceRepresentationType.JSON, null, propertyPaths);
//Resource Representation Type is JSON and FetchLevel is null and propertyPathsToExport is null
xmlOrJson = contentService.getContentObject(contentObject.getId(), ResourceRepresentationType.JSON, null, CacheRegion.NONE, null,false);
assertStringRepresentationHasTheProperPropertiesLoaded(xmlOrJson, contentObject, ResourceRepresentationType.JSON, null, null);
//Resource Representation Type is JSON and FetchLevel is null and propertyPathsToExport is empty
xmlOrJson = contentService.getContentObject(contentObject.getId(), ResourceRepresentationType.JSON, null, CacheRegion.NONE, emptyPropertiesToExportList,false);
assertStringRepresentationHasTheProperPropertiesLoaded(xmlOrJson, contentObject, ResourceRepresentationType.JSON, null, emptyPropertiesToExportList);
}
private void assertThatCmsOutcomeContainsOneContentObjectWithProperPropertiesLoaded(
ContentObject contentObject, List<String> propertyPaths,
FetchLevel fetchLevel, CmsOutcome<ContentObject> outcome) {
ContentObject contentObjectReloaded;
Assert.assertNotNull(outcome, "ContentService.getContentObject returned null");
Assert.assertEquals(outcome.getCount(), 1, "ContentService.getContentObject returned invalid count");
Assert.assertEquals(outcome.getLimit(), 1, "ContentService.getContentObject returned invalid limit");
Assert.assertEquals(outcome.getOffset(), 0, "ContentService.getContentObject returned invalid offset");
Assert.assertEquals(outcome.getResults().size(), 1, "ContentService.getContentObject returned invalid number of ContentObjects");
contentObjectReloaded = outcome.getResults().get(0);
assertContentObjectHasTheProperPropertiesLoaded(contentObject, contentObjectReloaded,fetchLevel,propertyPaths);
}
private void assertStringRepresentationHasTheProperPropertiesLoaded(
String xmlOrJson, ContentObject contentObject,
ResourceRepresentationType<String> resourceRepresentationType, FetchLevel fetchLevel, List<String> propertiesToExport) throws Exception {
xmlOrJson = removeWhitespacesIfNecessary(xmlOrJson);
String expectedURL = contentObject.getResourceApiURL(resourceRepresentationType,false,contentObject.getSystemName()!=null);
if (resourceRepresentationType.equals(ResourceRepresentationType.XML)){
String expectedProperty = "cmsIdentifier=\""+contentObject.getId()+"\"";
Assert.assertTrue(xmlOrJson.contains(expectedProperty), "XML export \n"+xmlOrJson + " \n does not contain content object identifier "+contentObject.getId());
expectedProperty = "systemName=\""+contentObject.getSystemName()+"\"";
Assert.assertTrue(xmlOrJson.contains(expectedProperty), "XML export \n"+xmlOrJson + " \n does not contain content object system name "+contentObject.getSystemName());
expectedProperty = "contentObjectTypeName=\""+contentObject.getContentObjectType()+"\"";
Assert.assertTrue(xmlOrJson.contains(expectedProperty), "XML export \n"+xmlOrJson + " \n does not contain content object type "+contentObject.getContentObjectType());
expectedProperty = "url=\""+expectedURL+"\"";
Assert.assertTrue(xmlOrJson.contains(expectedProperty), "XML export \n"+xmlOrJson + " \n does not contain content object url "+expectedURL);
if ((fetchLevel == null || fetchLevel == FetchLevel.ENTITY) && CollectionUtils.isEmpty(propertiesToExport)){
expectedProperty = "<profile";
Assert.assertTrue(xmlOrJson.contains(expectedProperty), "XML export \n"+xmlOrJson + " \n does not contain content object's profile ");
expectedProperty = "<title>"+StringUtils.deleteWhitespace(((StringProperty)contentObject.getCmsProperty("profile.title")).getSimpleTypeValue())+"</title>";
Assert.assertTrue(xmlOrJson.contains(expectedProperty), "XML export \n"+xmlOrJson + " \n does not contain content object's profile.title");
expectedProperty = "<created>"+convertCalendarToXMLFormat(((CalendarProperty)contentObject.getCmsProperty("profile.created")).getSimpleTypeValue(), true)+"</created>";
Assert.assertFalse(xmlOrJson.contains(expectedProperty), "XML export \n"+xmlOrJson + " \n contains content object's profile.created");
expectedProperty = "<accessibility";
Assert.assertFalse(xmlOrJson.contains(expectedProperty), "XML export \n"+xmlOrJson + " \n contains content object's accessibility");
expectedProperty = "<canBeReadBy>"+((StringProperty)contentObject.getCmsProperty("accessibility.canBeReadBy")).getFirstValue()+"</canBeReadBy>";
Assert.assertFalse(xmlOrJson.contains(expectedProperty), "XML export \n"+xmlOrJson + " \n contains content object's accessibility.canBeReadBy");
expectedProperty = "<owner";
Assert.assertTrue(xmlOrJson.contains(expectedProperty), "XML export \n"+xmlOrJson + " \n does not contain content object owner ");
expectedProperty = "cmsIdentifier=\""+contentObject.getOwner().getId()+"\"";
Assert.assertTrue(xmlOrJson.contains(expectedProperty), "XML export \n"+xmlOrJson + " \n does not contain content object's owner identifier "+contentObject.getOwner().getId());
expectedProperty = "externalId=\""+contentObject.getOwner().getExternalId()+"\"";
Assert.assertTrue(xmlOrJson.contains(expectedProperty), "XML export \n"+xmlOrJson + " \n does not contain content object's owner external id "+contentObject.getOwner().getExternalId());
//Since user is SYSTEM User , she has by default the label 'ACCOUNT SYSTEM'. If pretty print
//has been enabled, then xmlOrJson will processed to remove all whitespaces
//and therefore label wil be ACCOUNTSYSTEM. In this case we need to remove the whitespaces from the value
//in contentObject.getOwner().getLabel()
expectedProperty = "label=\""+removeWhitespacesIfNecessary(contentObject.getOwner().getLabel())+"\"";
Assert.assertTrue(xmlOrJson.contains(expectedProperty), "XML export \n"+xmlOrJson + " \n does not contain content object's owner external id "+contentObject.getOwner().getLabel());
for (CmsPropertyPath cmsPropertyPath: CmsPropertyPath.values()){
String propertyName = cmsPropertyPath.getPeriodDelimitedPath();
expectedProperty = "<"+PropertyPath.getLastDescendant(propertyName);
Assert.assertFalse(xmlOrJson.contains(expectedProperty), "XML export \n"+xmlOrJson + " \n contains content object property "+propertyName);
}
}
else if (fetchLevel == FetchLevel.FULL){
expectedProperty = "<profile";
Assert.assertTrue(xmlOrJson.contains(expectedProperty), "XML export \n"+xmlOrJson + " \n does not contain content object's profile ");
expectedProperty = "<title>"+StringUtils.deleteWhitespace(((StringProperty)contentObject.getCmsProperty("profile.title")).getSimpleTypeValue())+"</title>";
Assert.assertTrue(xmlOrJson.contains(expectedProperty), "XML export \n"+xmlOrJson + " \n does not contain content object's profile.title");
expectedProperty = "<created>"+convertCalendarToXMLFormat(((CalendarProperty)contentObject.getCmsProperty("profile.created")).getSimpleTypeValue(), true)+"</created>";
Assert.assertTrue(xmlOrJson.contains(expectedProperty), "XML export \n"+xmlOrJson + " \n does not contain content object's profile.created");
expectedProperty = "<accessibility";
Assert.assertTrue(xmlOrJson.contains(expectedProperty), "XML export \n"+xmlOrJson + " \n does not contain content object's accessibility");
expectedProperty = "<canBeReadBy>"+((StringProperty)contentObject.getCmsProperty("accessibility.canBeReadBy")).getFirstValue()+"</canBeReadBy>";
Assert.assertTrue(xmlOrJson.contains(expectedProperty), "XML export \n"+xmlOrJson + " \n does not contain content object's accessibility.canBeReadBy");
expectedProperty = "<owner";
Assert.assertTrue(xmlOrJson.contains(expectedProperty), "XML export \n"+xmlOrJson + " \n does not contain content object owner ");
expectedProperty = "cmsIdentifier=\""+contentObject.getOwner().getId()+"\"";
Assert.assertTrue(xmlOrJson.contains(expectedProperty), "XML export \n"+xmlOrJson + " \n does not contain content object's owner identifier "+contentObject.getOwner().getId());
expectedProperty = "externalId=\""+contentObject.getOwner().getExternalId()+"\"";
Assert.assertTrue(xmlOrJson.contains(expectedProperty), "XML export \n"+xmlOrJson + " \n does not contain content object's owner external id "+contentObject.getOwner().getExternalId());
//Since user is SYSTEM User , she has by default the label 'ACCOUNT SYSTEM'. If pretty print
//has been enabled, then xmlOrJson will processed to remove all whitespaces
//and therefore label wil be ACCOUNTSYSTEM. In this case we need to remove the whitespaces from the value
//in contentObject.getOwner().getLabel()
expectedProperty = "label=\""+removeWhitespacesIfNecessary(contentObject.getOwner().getLabel())+"\"";
Assert.assertTrue(xmlOrJson.contains(expectedProperty), "XML export \n"+xmlOrJson + " \n does not contain content object's owner external id "+contentObject.getOwner().getLabel());
for (CmsPropertyPath cmsPropertyPath: CmsPropertyPath.values()){
String propertyName = cmsPropertyPath.getPeriodDelimitedPath();
expectedProperty = "<"+PropertyPath.getLastDescendant(propertyName);
Assert.assertTrue(xmlOrJson.contains(expectedProperty), "XML export \n"+xmlOrJson + " \n does not contain content object property "+propertyName);
}
}
else{
if (propertiesToExport != null && propertiesToExport.size() > 0){
if (! propertiesToExport.contains("profile") && ! propertiesToExport.contains("profile.title") ){
expectedProperty = "<title>"+StringUtils.deleteWhitespace(((StringProperty)contentObject.getCmsProperty("profile.title")).getSimpleTypeValue())+"</title>";
Assert.assertFalse(xmlOrJson.contains(expectedProperty), "XML export \n"+xmlOrJson + " \n contains content object's profile.title");
expectedProperty = "<owner";
Assert.assertFalse(xmlOrJson.contains(expectedProperty), "XML export \n"+xmlOrJson + " \n contains content object owner ");
expectedProperty = "cmsIdentifier=\""+contentObject.getOwner().getId()+"\"";
Assert.assertFalse(xmlOrJson.contains(expectedProperty), "XML export \n"+xmlOrJson + " \n contains content object's owner identifier "+contentObject.getOwner().getId());
expectedProperty = "externalId=\""+contentObject.getOwner().getExternalId()+"\"";
Assert.assertFalse(xmlOrJson.contains(expectedProperty), "XML export \n"+xmlOrJson + " \n contains content object's owner external id "+contentObject.getOwner().getExternalId());
expectedProperty = "label=\""+contentObject.getOwner().getLabel()+"\"";
Assert.assertFalse(xmlOrJson.contains(expectedProperty), "XML export \n"+xmlOrJson + " \n contains content object's owner external id "+contentObject.getOwner().getLabel());
}
for (String propertyToExport : propertiesToExport){
String propertyName = PropertyPath.getLastDescendant(propertyToExport);
Assert.assertTrue(xmlOrJson.contains(propertyName), "XML export \n"+xmlOrJson + " \n does not contain content object property "+propertyName);
}
}
else{
expectedProperty = "<title>"+StringUtils.deleteWhitespace(((StringProperty)contentObject.getCmsProperty("profile.title")).getSimpleTypeValue())+"</title>";
Assert.assertTrue(xmlOrJson.contains(expectedProperty), "XML export \n"+xmlOrJson + " \n does not contain content object's profile.title");
expectedProperty = "<owner";
Assert.assertTrue(xmlOrJson.contains(expectedProperty), "XML export \n"+xmlOrJson + " \n does not content object owner ");
expectedProperty = "cmsIdentifier=\""+contentObject.getOwner().getId()+"\"";
Assert.assertTrue(xmlOrJson.contains(expectedProperty), "XML export \n"+xmlOrJson + " \n does not content object's owner identifier "+contentObject.getOwner().getId());
expectedProperty = "externalId=\""+contentObject.getOwner().getExternalId()+"\"";
Assert.assertTrue(xmlOrJson.contains(expectedProperty), "XML export \n"+xmlOrJson + " \n does not content object's owner external id "+contentObject.getOwner().getExternalId());
expectedProperty = "label=\""+contentObject.getOwner().getLabel()+"\"";
Assert.assertTrue(xmlOrJson.contains(expectedProperty), "XML export \n"+xmlOrJson + " \n does not content object's owner external id "+contentObject.getOwner().getLabel());
}
}
}
else if (resourceRepresentationType.equals(ResourceRepresentationType.JSON)){
String expectedProperty = "\"cmsIdentifier\":\""+contentObject.getId()+"\"";
Assert.assertTrue(xmlOrJson.contains(expectedProperty), "JSON export \n"+xmlOrJson + " \n does not contain content object identifier "+contentObject.getId());
expectedProperty = "\"systemName\":\""+contentObject.getSystemName()+"\"";
Assert.assertTrue(xmlOrJson.contains(expectedProperty), "JSON export \n"+xmlOrJson + " \n does not contain content object system name "+contentObject.getSystemName());
expectedProperty = "\"contentObjectTypeName\":\""+contentObject.getContentObjectType()+"\"";
Assert.assertTrue(xmlOrJson.contains(expectedProperty), "JSON export \n"+xmlOrJson + " \n does not contain content object type "+contentObject.getContentObjectType());
expectedProperty = "\"url\":\""+expectedURL+"\"";
Assert.assertTrue(xmlOrJson.contains(expectedProperty), "JSON export \n"+xmlOrJson + " \n does not contain content object url "+expectedURL);
if ((fetchLevel == null || fetchLevel == FetchLevel.ENTITY ) && CollectionUtils.isEmpty(propertiesToExport)){
expectedProperty = "\"profile\":{";
Assert.assertTrue(xmlOrJson.contains(expectedProperty), "JSON export \n"+xmlOrJson + " \n does not contain content object's profile ");
expectedProperty = "\"title\":\""+StringUtils.deleteWhitespace(((StringProperty)contentObject.getCmsProperty("profile.title")).getSimpleTypeValue())+"\"";
Assert.assertTrue(xmlOrJson.contains(expectedProperty), "JSON export \n"+xmlOrJson + " \n does not contain content object's profile.title");
expectedProperty = "\"created\":\""+convertCalendarToXMLFormat(((CalendarProperty)contentObject.getCmsProperty("profile.created")).getSimpleTypeValue(), true)+"\"";
Assert.assertFalse(xmlOrJson.contains(expectedProperty), "JSON export \n"+xmlOrJson + " \n contains content object's profile.created");
expectedProperty = "\"accessibility\":{";
Assert.assertFalse(xmlOrJson.contains(expectedProperty), "JSON export \n"+xmlOrJson + " \n contains content object's accessibility");
expectedProperty = "\"canBeReadBy\":\""+((StringProperty)contentObject.getCmsProperty("accessibility.canBeReadBy")).getFirstValue()+"\"";
Assert.assertFalse(xmlOrJson.contains(expectedProperty), "JSON export \n"+xmlOrJson + " \n contains content object's accessibility.canBeReadBy");
expectedProperty = "\"owner\":{";
Assert.assertTrue(xmlOrJson.contains(expectedProperty), "JSON export \n"+xmlOrJson + " \n does not contain content object owner ");
expectedProperty = "\"cmsIdentifier\":\""+contentObject.getOwner().getId()+"\"";
Assert.assertTrue(xmlOrJson.contains(expectedProperty), "JSON export \n"+xmlOrJson + " \n does not contain content object's owner identifier "+contentObject.getOwner().getId());
expectedProperty = "\"externalId\":\""+contentObject.getOwner().getExternalId()+"\"";
Assert.assertTrue(xmlOrJson.contains(expectedProperty), "JSON export \n"+xmlOrJson + " \n does not contain content object's owner external id "+contentObject.getOwner().getExternalId());
//Since user is SYSTEM User , she has by default the label 'ACCOUNT SYSTEM'. If pretty print
//has been enabled, then xmlOrJson will processed to remove all whitespaces
//and therefore label wil be ACCOUNTSYSTEM. In this case we need to remove the whitespaces from the value
//in contentObject.getOwner().getLabel()
expectedProperty = "\"label\":\""+removeWhitespacesIfNecessary(contentObject.getOwner().getLabel())+"\"";
Assert.assertTrue(xmlOrJson.contains(expectedProperty), "JSON export \n"+xmlOrJson + " \n does not contain content object's owner external id "+contentObject.getOwner().getLabel());
for (CmsPropertyPath cmsPropertyPath: CmsPropertyPath.values()){
final String propertyName = cmsPropertyPath.getPeriodDelimitedPath();
expectedProperty = PropertyPath.getLastDescendant(propertyName);
Assert.assertFalse(xmlOrJson.contains(expectedProperty), "JSON export \n"+xmlOrJson + " \n contains content object property "+propertyName);
}
}
else if (fetchLevel == FetchLevel.FULL){
expectedProperty = "\"profile\":{";
Assert.assertTrue(xmlOrJson.contains(expectedProperty), "JSON export \n"+xmlOrJson + " \n does not contain content object's profile ");
expectedProperty = "\"title\":\""+StringUtils.deleteWhitespace(((StringProperty)contentObject.getCmsProperty("profile.title")).getSimpleTypeValue())+"\"";
Assert.assertTrue(xmlOrJson.contains(expectedProperty), "JSON export \n"+xmlOrJson + " \n does not contain content object's profile.title");
expectedProperty = "\"created\":\""+convertCalendarToXMLFormat(((CalendarProperty)contentObject.getCmsProperty("profile.created")).getSimpleTypeValue(), true)+"\"";
Assert.assertTrue(xmlOrJson.contains(expectedProperty), "JSON export \n"+xmlOrJson + " \n does not contain content object's profile.created");
expectedProperty = "\"accessibility\":{";
Assert.assertTrue(xmlOrJson.contains(expectedProperty), "JSON export \n"+xmlOrJson + " \n does not contain content object's accessibility");
expectedProperty = "\"canBeReadBy\":[\""+((StringProperty)contentObject.getCmsProperty("accessibility.canBeReadBy")).getFirstValue()+"\"]";
Assert.assertTrue(xmlOrJson.contains(expectedProperty), "JSON export \n"+xmlOrJson + " \n does not contain content object's accessibility.canBeReadBy");
expectedProperty = "\"owner\":{";
Assert.assertTrue(xmlOrJson.contains(expectedProperty), "JSON export \n"+xmlOrJson + " \n does not contain content object owner ");
expectedProperty = "\"cmsIdentifier\":\""+contentObject.getOwner().getId()+"\"";
Assert.assertTrue(xmlOrJson.contains(expectedProperty), "JSON export \n"+xmlOrJson + " \n does not contain content object's owner identifier "+contentObject.getOwner().getId());
expectedProperty = "\"externalId\":\""+contentObject.getOwner().getExternalId()+"\"";
Assert.assertTrue(xmlOrJson.contains(expectedProperty), "JSON export \n"+xmlOrJson + " \n does not contain content object's owner external id "+contentObject.getOwner().getExternalId());
//Since user is SYSTEM User , she has by default the label 'ACCOUNT SYSTEM'. If pretty print
//has been enabled, then xmlOrJson will processed to remove all whitespaces
//and therefore label wil be ACCOUNTSYSTEM. In this case we need to remove the whitespaces from the value
//in contentObject.getOwner().getLabel()
expectedProperty = "\"label\":\""+removeWhitespacesIfNecessary(contentObject.getOwner().getLabel())+"\"";
Assert.assertTrue(xmlOrJson.contains(expectedProperty), "JSON export \n"+xmlOrJson + " \n does not contain content object's owner external id "+contentObject.getOwner().getLabel());
for (CmsPropertyPath cmsPropertyPath: CmsPropertyPath.values()){
final String propertyName = cmsPropertyPath.getPeriodDelimitedPath();
expectedProperty = PropertyPath.getLastDescendant(propertyName);
Assert.assertTrue(xmlOrJson.contains(expectedProperty), "JSON export \n"+xmlOrJson + " \n does not contain content object property "+propertyName);
}
}
else{
if (propertiesToExport != null && propertiesToExport.size() > 0){
if (! propertiesToExport.contains("profile") && ! propertiesToExport.contains("profile.title") ){
expectedProperty = "\"title\":\""+StringUtils.deleteWhitespace(((StringProperty)contentObject.getCmsProperty("profile.title")).getSimpleTypeValue())+"\"";
Assert.assertFalse(xmlOrJson.contains(expectedProperty), "JSON export \n"+xmlOrJson + " \n contains content object's profile.title");
expectedProperty = "\"owner\":{";
Assert.assertFalse(xmlOrJson.contains(expectedProperty), "JSON export \n"+xmlOrJson + " \n contains content object owner ");
expectedProperty = "\"cmsIdentifier\":\""+contentObject.getOwner().getId()+"\"";
Assert.assertFalse(xmlOrJson.contains(expectedProperty), "JSON export \n"+xmlOrJson + " \n contains content object's owner identifier "+contentObject.getOwner().getId());
expectedProperty = "\"externalId\":\""+contentObject.getOwner().getExternalId()+"\"";
Assert.assertFalse(xmlOrJson.contains(expectedProperty), "JSON export \n"+xmlOrJson + " \n contains content object's owner external id "+contentObject.getOwner().getExternalId());
//Since user is SYSTEM User , she has by default the label 'ACCOUNT SYSTEM'. If pretty print
//has been enabled, then xmlOrJson will processed to remove all whitespaces
//and therefore label will be ACCOUNTSYSTEM. In this case we need to remove the whitespaces from the value
//in contentObject.getOwner().getLabel()
expectedProperty = "\"label\":\""+removeWhitespacesIfNecessary(contentObject.getOwner().getLabel())+"\"";
Assert.assertFalse(xmlOrJson.contains(expectedProperty), "JSON export \n"+xmlOrJson + " \n contains content object's owner external id "+contentObject.getOwner().getLabel());
}
for (String propertyToExport : propertiesToExport){
String propertyName = PropertyPath.getLastDescendant(propertyToExport);
Assert.assertTrue(xmlOrJson.contains(propertyName), "JSON export \n"+xmlOrJson + " \n does not contain content object property "+propertyName);
}
}
else{
expectedProperty = "\"title\":\""+StringUtils.deleteWhitespace(((StringProperty)contentObject.getCmsProperty("profile.title")).getSimpleTypeValue())+"\"";
Assert.assertTrue(xmlOrJson.contains(expectedProperty), "JSON export \n"+xmlOrJson + " \n does not contain content object's profile.title "+expectedProperty );
expectedProperty = "\"owner\":{";
Assert.assertTrue(xmlOrJson.contains(expectedProperty), "JSON export \n"+xmlOrJson + " \n does not contain content object owner ");
expectedProperty = "\"cmsIdentifier\":\""+contentObject.getOwner().getId()+"\"";
Assert.assertTrue(xmlOrJson.contains(expectedProperty), "JSON export \n"+xmlOrJson + " \n does not contain content object's owner identifier "+contentObject.getOwner().getId());
expectedProperty = "\"externalId\":\""+contentObject.getOwner().getExternalId()+"\"";
Assert.assertTrue(xmlOrJson.contains(expectedProperty), "JSON export \n"+xmlOrJson + " \n does not contain content object's owner external id "+contentObject.getOwner().getExternalId());
//Since user is SYSTEM User , she has by default the label 'ACCOUNT SYSTEM'. If pretty print
//has been enabled, then xmlOrJson will processed to remove all whitespaces
//and therefore label will be ACCOUNTSYSTEM. In this case we need to remove the whitespaces from the value
//in contentObject.getOwner().getLabel()
expectedProperty = "\"label\":\""+removeWhitespacesIfNecessary(contentObject.getOwner().getLabel())+"\"";
Assert.assertTrue(xmlOrJson.contains(expectedProperty), "JSON export \n"+xmlOrJson + " \n does not contain content object's owner external id "+contentObject.getOwner().getLabel());
}
}
}
else{
throw new Exception("Invalid resource representation type "+resourceRepresentationType);
}
}
private void assertContentObjectHasTheProperPropertiesLoaded(ContentObject contentObject, ContentObject contentObjectReloaded, FetchLevel fetchLevel, List<String> propertiesToExport) {
Assert.assertNotNull(contentObjectReloaded, "ContentService.getContentObject did not return ContentObject with name "+contentObject.getSystemName());
Assert.assertEquals(contentObjectReloaded.getId(), contentObject.getId(), "ContentService.getContentObject returned invalid contentObject");
Assert.assertEquals(contentObjectReloaded.getSystemName(), contentObject.getSystemName(), "ContentService.getContentObject returned invalid system name");
Assert.assertNotNull(contentObjectReloaded.getContentObjectType(), "ContentService.getContentObject did not return content type for ContentObject with name "+contentObject.getSystemName());
Assert.assertEquals(contentObjectReloaded.getContentObjectType(), contentObject.getContentObjectType(), "ContentService.getContentObject returned invalid content type");
Assert.assertNotNull(contentObjectReloaded.getOwner(), "ContentService.getContentObject did not return owner for ContentObject with name "+contentObject.getSystemName());
Assert.assertEquals(contentObjectReloaded.getOwner().getId(), contentObject.getOwner().getId(), "ContentService.getContentObject returned invalid owner id");
Assert.assertEquals(contentObjectReloaded.getOwner().getLabel(), contentObject.getOwner().getLabel(), "ContentService.getContentObject returned invalid owner label");
Assert.assertEquals(contentObjectReloaded.getOwner().getExternalId(), contentObject.getOwner().getExternalId(), "ContentService.getContentObject returned invalid owner externalId");
if ((fetchLevel == null || fetchLevel == FetchLevel.ENTITY ) && CollectionUtils.isEmpty(propertiesToExport)){
Assert.assertTrue(contentObjectReloaded.getComplexCmsRootProperty().isChildPropertyLoaded("profile.title"),
"ContentService.getContentObject did not return property 'profile.title'");
Assert.assertFalse(contentObjectReloaded.getComplexCmsRootProperty().isChildPropertyLoaded("profile.created"),"ContentService.getContentObject return property 'profile.created'");
Assert.assertFalse(contentObjectReloaded.getComplexCmsRootProperty().isChildPropertyLoaded("accessibility.canBeReadBy"),"ContentService.getContentObject return property 'accessibility.canBeReadBy'");
for (CmsPropertyPath cmsPropertyPath: CmsPropertyPath.values()){
Assert.assertFalse(contentObjectReloaded.getComplexCmsRootProperty().isChildPropertyLoaded(cmsPropertyPath.getPeriodDelimitedPath()),"ContentService.getContentObject return property '"+cmsPropertyPath.getPeriodDelimitedPath()+"'");
}
}
else if (fetchLevel == FetchLevel.FULL){
Assert.assertTrue(contentObjectReloaded.getComplexCmsRootProperty().isChildPropertyLoaded("profile.title"),
"ContentService.getContentObject did not return property 'profile.title'");
Assert.assertTrue(contentObjectReloaded.getComplexCmsRootProperty().isChildPropertyLoaded("profile.created"),"ContentService.getContentObject did not return property 'profile.created'");
Assert.assertTrue(contentObjectReloaded.getComplexCmsRootProperty().isChildPropertyLoaded("accessibility.canBeReadBy"),"ContentService.getContentObject did not return property 'accessibility.canBeReadBy'");
for (CmsPropertyPath cmsPropertyPath: CmsPropertyPath.values()){
Assert.assertTrue(contentObjectReloaded.getComplexCmsRootProperty().isChildPropertyLoaded(cmsPropertyPath.getPeriodDelimitedPath()),"ContentService.getContentObject did not return property '"+cmsPropertyPath.getPeriodDelimitedPath()+"'");
}
}
else{
if (propertiesToExport != null && propertiesToExport.size() > 0){
if (! propertiesToExport.contains("profile") && ! propertiesToExport.contains("profile.title") ){
Assert.assertFalse(contentObjectReloaded.getComplexCmsRootProperty().isChildPropertyLoaded("profile.title"),
"ContentService.getContentObject returned property 'profile.title'");
}
for (String propertyToExport : propertiesToExport){
Assert.assertTrue(contentObjectReloaded.getComplexCmsRootProperty().isChildPropertyLoaded(propertyToExport),"ContentService.getContentObject did not return property '"+propertyToExport+"'");
}
}
else{
Assert.assertTrue(contentObjectReloaded.getComplexCmsRootProperty().isChildPropertyLoaded("profile.title"),
"ContentService.getContentObject did not return property 'profile.title'");
}
}
}
private void assertObjectHasReference(String objectId, String referencedObjectId, String property){
ContentObject object = contentService.getContentObject(objectId, ResourceRepresentationType.CONTENT_OBJECT_INSTANCE, FetchLevel.ENTITY, null, null, false);
CmsProperty propertyReference = object.getCmsProperty(property);
Assert.assertTrue(propertyReference instanceof ObjectReferenceProperty, "Property "+property+ " is not of type "+ValueType.ObjectReference+ " in object "+ object.getSystemName());
Assert.assertTrue(((ObjectReferenceProperty)propertyReference).hasValues(), "Property "+property+ " has no values in object "+ object.getSystemName());
Assert.assertEquals(referencedObjectId, ((ObjectReferenceProperty)propertyReference).getSimpleTypeValue().getId(), "Property "+property+ " value is an invalid reference in object "+ object.getSystemName());
}
private void assertPropertyExistsAndHasTheExpectedValue(ContentObject object, String propertyPath, String expectedValue){
StringProperty property = (StringProperty)object.getCmsProperty(propertyPath);
Assert.assertNotNull(property, "Property "+ propertyPath+ " was not saved ");
Assert.assertTrue(property.hasValues(), " Property "+ propertyPath+ " does not contain a value");
Assert.assertEquals(property.getSimpleTypeValue(), expectedValue, "Property "+ propertyPath+ " contains invalid value.");
}
}